/ Hex Artifact Content
Login

Artifact 762c2b146cf5fe7a7f743af1bbfed4a966aa937a:


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 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0f60: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0f70: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0f90: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0fa0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0fb0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0fc0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0fd0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0fe0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0ff0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
1000: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1020: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1030: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1050: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1060: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1070: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1080: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1090: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
10a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10b0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
10c0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
10e0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
10f0: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1100: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1110: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1120: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1130: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1140: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1150: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1160: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1170: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1180: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11a0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
11b0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
11c0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
11d0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
11e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1200: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1210: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1230: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1240: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1250: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1260: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1270: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1280: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1290: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
12b0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
12c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
12d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
12f0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1310: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1340: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1350: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1360: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1380: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1390: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
13a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
13b0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
13c0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
13d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13e0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
13f0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1410: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1420: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1430: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1440: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1460: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1470: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1490: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
14a0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
14b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
14c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
14d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
14e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14f0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1500: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1510: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1520: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1540: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1550: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1560: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1570: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1580: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1590: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
15a0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
15b0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
15c0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
15d0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
15e0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
15f0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1600: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1610: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1620: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1630: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1640: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1650: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1660: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1670: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1680: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1690: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
16a0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
16b0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
16c0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
16d0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
16e0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
16f0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1700: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1710: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1720: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1730: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1740: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1750: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1760: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1770: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1780: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1790: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
17a0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
17b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17c0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
17d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
17e0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
17f0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1800: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1810: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1820: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1830: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61    int n = p->nLa
1840: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  belAlloc*2 + 5;.
1850: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1860: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1870: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1880: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  n*sizeof(p->aLab
18c0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e  el[0]));.    p->
18d0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71  nLabelAlloc = sq
18e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18f0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1900: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  el)/sizeof(p->aL
1910: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  abel[0]);.  }.  
1920: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1930: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1940: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1950: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1960: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1970: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1980: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1990: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
19a0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
19b0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
19c0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
19d0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
19e0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
19f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1a00: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1a20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1a30: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1a40: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1a60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1a70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1a80: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1a90: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1aa0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1ab0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1ac0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1ad0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1ae0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1af0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1b00: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1b10: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1b20: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1b30: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1b40: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1b60: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1b70: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1b90: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1ba0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1bb0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1bc0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1bd0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1be0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1bf0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1c00: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1c10: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1c20: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1c30: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1c40: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1c50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c60: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1c70: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1c80: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1c90: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1ca0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1cb0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1ce0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1cf0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1d00: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1d10: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1d20: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1d30: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1d40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1d50: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1d60: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1d70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1d80: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1d90: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1da0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1db0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1dc0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1dd0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1de0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1df0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1e00: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1e10: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1e20: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1e30: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1e60: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1e70: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1e80: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1e90: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1ea0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1eb0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1ee0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1ef0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1f00: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1f10: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
1f20: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
1f30: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
1f40: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
1f50: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
1f60: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
1f70: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
1f80: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
1f90: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
1fa0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
1fb0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
1fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
1fd0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
1fe0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
1ff0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
2000: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2010: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2020: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2030: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2040: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2050: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2060: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2070: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2080: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2090: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
20a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
20b0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
20c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
20d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
20e0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
20f0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
2100: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2110: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2120: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2140: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2150: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2170: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2190: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
21a0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
21b0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
21c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
21d0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
21e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
21f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2210: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2220: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2230: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2250: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2270: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2280: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2290: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22a0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
22b0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
22c0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
22d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22e0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
22f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2300: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2310: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2320: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2330: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2340: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2350: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2370: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2380: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2390: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
23a0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
23b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
23c0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
23d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
23f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2400: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2410: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2420: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2430: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2440: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2450: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2460: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2470: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2480: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2490: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
24a0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
24b0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
24c0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
24d0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
24e0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
24f0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2500: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2520: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2540: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2550: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2560: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2570: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2580: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2590: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
25a0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
25b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
25c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
25d0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
25e0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
25f0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2600: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2610: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2620: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2630: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2640: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2650: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2660: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2670: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2680: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2690: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
26a0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
26b0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
26c0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
26d0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
26e0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
26f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2700: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2710: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2720: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2730: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2740: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2750: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2760: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2770: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2780: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2790: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
27a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
27b0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
27c0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
27d0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
27e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27f0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2800: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2810: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
2820: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2830: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2840: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
2850: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2860: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2870: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2880: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2890: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
28a0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
28b0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
28c0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
28d0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
28e0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
28f0: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2900: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2910: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
2920: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
2930: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
2940: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
2950: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
2960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2970: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2980: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2990: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
29a0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
29b0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
29c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
29d0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
29e0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
29f0: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2a00: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2a10: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
2a20: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
2a30: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
2a40: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
2a50: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
2a60: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
2a70: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2a80: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2a90: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2aa0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2ab0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2ac0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2ad0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2ae0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2af0: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2b00: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2b10: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
2b20: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
2b30: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
2b40: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
2b50: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
2b60: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
2b70: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2b80: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2b90: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2ba0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
2bb0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
2bc0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
2bd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
2be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2bf0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
2c00: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
2c10: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
2c20: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
2c30: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
2c40: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
2c50: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
2c60: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
2c70: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f  adOnly = 1;.  fo
2c80: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2c90: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2ca0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2cb0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2cc0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70  ->opcode;..    p
2cd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71  Op->opflags = sq
2ce0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
2cf0: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20  rty[opcode];.   
2d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2d10: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
2d20: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
2d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2d40: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
2d50: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
2d60: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
2d70: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e   opcode==OP_Tran
2d80: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
2d90: 70 32 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  p2!=0 ){.      p
2da0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
2db0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dc0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2dd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2de0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
2df0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
2e00: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
2e10: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
2e20: 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->p2;.    }else 
2e30: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
2e40: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
2e50: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
2e60: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
2e70: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
2e80: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
2e90: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2ea0: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2eb0: 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-1].p1;.      
2ec0: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2ed0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2ee0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2ef0: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
2f00: 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  gs & OPFLG_JUMP)
2f10: 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  !=0 && pOp->p2<0
2f20: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f30: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
2f40: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
2f50: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
2f60: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
2f70: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2f80: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
2f90: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
2fa0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
2fb0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
2fc0: 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  MaxArgs;.}../*.*
2fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
2fe0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2ff0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3000: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3020: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3030: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3040: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3050: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
3060: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
3070: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3080: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
3090: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
30a0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
30b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
30c0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
30d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
30e0: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
30f0: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3100: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3110: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3120: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3130: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3140: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
3150: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
3160: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
3170: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3180: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
3190: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
31a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
31b0: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
31c0: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
31d0: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
31e0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
31f0: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3200: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3210: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3220: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3230: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3240: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
3250: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
3260: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
3270: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
3280: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
3290: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
32a0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
32b0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
32c0: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
32d0: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
32e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
32f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3300: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3310: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3320: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3330: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3340: 61 4d 75 74 65 78 2e 6e 4d 75 74 65 78 3d 3d 30  aMutex.nMutex==0
3350: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
3360: 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41  Values(p, pnMaxA
3370: 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70  rg);.  *pnOp = p
3380: 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20  ->nOp;.  p->aOp 
3390: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f  = 0;.  return aO
33a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
33b0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
33c0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
33d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
33e0: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
33f0: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
3400: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
3410: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
3420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3430: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
3440: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
3450: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
3460: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
3470: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3480: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3490: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
34a0: 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  nOp > p->nOpAllo
34b0: 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79  c && growOpArray
34c0: 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (p) ){.    retur
34d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
34e0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
34f0: 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b  ALWAYS(nOp>0) ){
3500: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3510: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3520: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
3530: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
3540: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
3550: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
3560: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
3570: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
3580: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
3590: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
35a0: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
35b0: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
35c0: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
35d0: 28 20 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74  ( p2<0 && (sqlit
35e0: 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  e3OpcodeProperty
35f0: 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26  [pOut->opcode] &
3600: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
3610: 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  ){.        pOut-
3620: 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44  >p2 = addr + ADD
3630: 52 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  R(p2);.      }el
3640: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74  se{.        pOut
3650: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20  ->p2 = p2;.     
3660: 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70   }.      pOut->p
3670: 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20  3 = pIn->p3;.   
3680: 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20     pOut->p4type 
3690: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
36a0: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
36b0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   0;.      pOut->
36c0: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
36d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
36e0: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
36f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
3700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
3710: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
3720: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
3730: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
3740: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
3750: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
3760: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
3770: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
3780: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
3790: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
37a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
37b0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
37c0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
37d0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
37e0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
37f0: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
3800: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3810: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
3820: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
3830: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
3840: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
3850: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
3860: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
3870: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
3880: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3890: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69  ngeP1(Vdbe *p, i
38a0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
38b0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
38c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
38d0: 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ddr>=0 );.  if( 
38e0: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20  p->nOp>addr ){. 
38f0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3900: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
3910: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3920: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3930: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
3940: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
3950: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
3960: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
3970: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
3980: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
3990: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
39a0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
39b0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
39c0: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
39d0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
39e0: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
39f0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64    if( p->nOp>add
3a00: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3a10: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
3a20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3a30: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3a40: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
3a50: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3a60: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
3a70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3a80: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
3a90: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
3aa0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3ab0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
3ac0: 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66   addr>=0 );.  if
3ad0: 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b  ( p->nOp>addr ){
3ae0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
3af0: 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p3 = val;.  }.
3b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3b10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3b20: 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P5 operand for 
3b30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3b40: 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61  y.** added opera
3b50: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3b60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3b70: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61  5(Vdbe *p, u8 va
3b80: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
3ba0: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
3bb0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
3bc0: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
3bd0: 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d  1].p5 = val;.  }
3be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3bf0: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
3c00: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
3c10: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
3c20: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
3c30: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
3c40: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
3c50: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
3c60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3c70: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
3c80: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
3c90: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3ca0: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
3cb0: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  Op);.}.../*.** I
3cc0: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
3cd0: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
3ce0: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
3cf0: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
3d00: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
3d10: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
3d20: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
3d30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
3d40: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3d50: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
3d60: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b   FuncDef *pDef){
3d70: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44  .  if( ALWAYS(pD
3d80: 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c  ef) && (pDef->fl
3d90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
3da0: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
3db0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3dc0: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
3dd0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
3de0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
3df0: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
3e00: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
3e10: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
3e20: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
3e30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3e40: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
3e50: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
3e60: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
3e70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
3e80: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
3e90: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
3ea0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
3eb0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
3ec0: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
3ed0: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
3ee0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
3ef0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f00: 49 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20  INTARRAY:.      
3f10: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
3f20: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
3f30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3f40: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
3f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3f60: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
3f70: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20  PRINTF: {.      
3f80: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
3f90: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
3fa0: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
3fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3fc0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3fd0: 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20  P4_VDBEFUNC: {. 
3fe0: 20 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20         VdbeFunc 
3ff0: 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64  *pVdbeFunc = (Vd
4000: 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20  beFunc *)p4;.   
4010: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
4020: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  alFunction(db, p
4030: 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29  VdbeFunc->pFunc)
4040: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
4050: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4060: 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44  0 ) sqlite3VdbeD
4070: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64  eleteAuxData(pVd
4080: 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20  beFunc, 0);.    
4090: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
40a0: 65 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29  e(db, pVdbeFunc)
40b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
40c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
40d0: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
40e0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
40f0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4100: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
4110: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4130: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
4140: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4150: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4160: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
4170: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
4180: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
4190: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
41a0: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
41b0: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
41c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
41d0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
41e0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
41f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4200: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
4210: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4230: 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20  se P4_VTAB : {. 
4240: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4250: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4260: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
4270: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29  ck((VTable *)p4)
4280: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
42a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
42b0: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
42c0: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
42d0: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
42e0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
42f0: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
4300: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
4310: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
4320: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
4330: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
4340: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
4350: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
4360: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4370: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
4380: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
4390: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
43a0: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
43b0: 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e  =aOp; pOp<&aOp[n
43c0: 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  Op]; pOp++){.   
43d0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
43e0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
43f0: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
4400: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
4410: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4420: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
4430: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
4440: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4450: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
4460: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
4470: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
4480: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
4490: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
44a0: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
44b0: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
44c0: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
44d0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
44e0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
44f0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
4500: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
4510: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
4520: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
4530: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
4540: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
4550: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
4560: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
4570: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
4580: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
4590: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
45a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
45b0: 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69  N opcodes starti
45c0: 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f  ng at addr to No
45d0: 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  -ops..*/.void sq
45e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
45f0: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
4600: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b  nt addr, int N){
4610: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
4620: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4630: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
4640: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
4650: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77  b = p->db;.    w
4660: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
4670: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
4680: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
4690: 70 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  p4.p);.      mem
46a0: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
46b0: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
46c0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
46d0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
46e0: 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pOp++;.    }.  }
46f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4700: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4710: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
4720: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
4730: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
4740: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
4750: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
4760: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
4770: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
4780: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
4790: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
47a0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
47b0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
47c0: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
47d0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
47e0: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
47f0: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
4800: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
4810: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
4820: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
4830: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
4840: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4850: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
4860: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
4870: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
4880: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
4890: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
48a0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
48b0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
48c0: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
48d0: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
48e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f  .**.** If n==P4_
48f0: 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73  KEYINFO it means
4900: 20 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70   that zP4 is a p
4910: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
4920: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
4930: 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65  * A copy is made
4940: 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   of the KeyInfo 
4950: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d  structure into m
4960: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4970: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
4980: 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65  alloc, to be fre
4990: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
49a0: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a   is finalized..*
49b0: 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  * n==P4_KEYINFO_
49c0: 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65  HANDOFF indicate
49d0: 73 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  s that zP4 point
49e0: 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  s to a KeyInfo s
49f0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72  tructure.** stor
4a00: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61  ed in memory tha
4a10: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
4a20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4a30: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54  qlite3_malloc. T
4a40: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
4a50: 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68  ould not free th
4a60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74  e allocation, it
4a70: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77   will be freed w
4a80: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a  hen the Vdbe is.
4a90: 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  ** finalized..**
4aa0: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
4ab0: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
4ac0: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
4ad0: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
4ae0: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
4af0: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
4b00: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
4b10: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
4b20: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
4b30: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
4b40: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
4b50: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
4b60: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
4b70: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
4b80: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
4b90: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
4ba0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
4bb0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
4bc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4bd0: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
4be0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
4bf0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
4c00: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
4c10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
4c20: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
4c30: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
4c40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4c50: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
4c60: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  IT );.  if( p->a
4c70: 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op==0 || db->mal
4c80: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
4c90: 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49   if ( n!=P4_KEYI
4ca0: 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41  NFO && n!=P4_VTA
4cb0: 42 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  B ) {.      free
4cc0: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
4cd0: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4cf0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
4d00: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
4d10: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
4d20: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
4d30: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
4d40: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
4d50: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
4d60: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
4d70: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
4d80: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
4d90: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
4da0: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
4db0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
4dc0: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
4dd0: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
4de0: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
4df0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
4e00: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
4e10: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
4e20: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
4e30: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
4e40: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
4e50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
4e60: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
4e70: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
4e80: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
4e90: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
4ea0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
4eb0: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
4ec0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
4ed0: 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
4ee0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  KeyInfo;.    int
4ef0: 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a   nField, nByte;.
4f00: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
4f10: 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e  KeyInfo*)zP4)->n
4f20: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
4f30: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
4f40: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
4f50: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
4f60: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e  o->aColl[0]) + n
4f70: 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49  Field;.    pKeyI
4f80: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
4f90: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79 74  allocRaw(0, nByt
4fa0: 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  e);.    pOp->p4.
4fb0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
4fc0: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  nfo;.    if( pKe
4fd0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75  yInfo ){.      u
4fe0: 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  8 *aSortOrder;. 
4ff0: 20 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61       memcpy((cha
5000: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34  r*)pKeyInfo, zP4
5010: 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c 64  , nByte - nField
5020: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
5030: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
5040: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
5050: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
5060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
5070: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5080: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
5090: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
50a0: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
50b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
50c0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
50d0: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
50e0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
50f0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
5100: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
5110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5120: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5130: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
5140: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5150: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
5160: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
5170: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
5180: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5190: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
51a0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
51b0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
51c0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
51d0: 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d  VTAB ){.    pOp-
51e0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
51f0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5200: 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20  ype = P4_VTAB;. 
5210: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f     sqlite3VtabLo
5220: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ck((VTable *)zP4
5230: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
5240: 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e  (VTable *)zP4)->
5250: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
5260: 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a  else if( n<0 ){.
5270: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5280: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
5290: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73  pOp->p4type = (s
52a0: 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20  igned char)n;.  
52b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
52c0: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
52d0: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
52e0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
52f0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5300: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
5310: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5320: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
5330: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
5340: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  EBUG./*.** Chang
5350: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
5360: 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65   the the most re
5370: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
5380: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
5390: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
53a0: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
53b0: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
53c0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
53d0: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
53e0: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
53f0: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
5400: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
5410: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
5420: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
5430: 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  uild..*/.void sq
5440: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
5450: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
5460: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5470: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5480: 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  p;.  if( !p ) re
5490: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
54a0: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
54b0: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
54c0: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
54d0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
54e0: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
54f0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5500: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
5510: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
5520: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
5530: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5540: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
5550: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
5560: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5570: 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20  p->db, *pz);.   
5580: 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d   *pz = sqlite3VM
5590: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
55a0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
55b0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
55c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
55d0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
55e0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
55f0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5600: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5610: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
5620: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
5630: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
5640: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
5650: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70  >nOp>0 || p->aOp
5660: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
5670: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
5680: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5690: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d  Comment==0 || p-
56a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
56b0: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
56c0: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  p ){.    char **
56d0: 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  pz = &p->aOp[p->
56e0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b  nOp-1].zComment;
56f0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
5700: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
5710: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
5720: 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a  >db, *pz);.    *
5730: 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  pz = sqlite3VMPr
5740: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
5750: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5760: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5770: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
5780: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  G */../*.** Retu
5790: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
57a0: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
57b0: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
57c0: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
57d0: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
57e0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
57f0: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
5800: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
5810: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
5820: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
5830: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
5840: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
5850: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
5860: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
5870: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
5880: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
5890: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
58a0: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
58b0: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
58c0: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
58d0: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
58e0: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
58f0: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
5900: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
5910: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
5920: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20  ning.** after a 
5930: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
5940: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
5950: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
5960: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
5970: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5980: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
5990: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
59a0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
59b0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
59c0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
59d0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
59e0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
59f0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
5a00: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
5a10: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a  ith Valgrind..**
5a20: 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69  .** About the #i
5a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5a40: 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c  _TRACE:  Normall
5a50: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
5a60: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a  is never called.
5a70: 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70  ** unless p->nOp
5a80: 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63  >0.  This is bec
5a90: 61 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65  ause in the abse
5aa0: 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  nse of SQLITE_OM
5ab0: 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20  IT_TRACE,.** an 
5ac0: 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63  OP_Trace instruc
5ad0: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
5ae0: 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74  nserted by sqlit
5af0: 65 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73  e3VdbeGet() as s
5b00: 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20  oon as.** a new 
5b10: 56 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e  VDBE is created.
5b20: 20 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65    So we are free
5b30: 20 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20   to set addr to 
5b40: 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74  p->nOp-1 without
5b50: 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f  .** having to do
5b60: 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61  uble-check to ma
5b70: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5b80: 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e   result is non-n
5b90: 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20  egative. But.** 
5ba0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  if SQLITE_OMIT_T
5bb0: 52 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c  RACE is defined,
5bc0: 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73   the OP_Trace is
5bd0: 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20   omitted and we 
5be0: 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68  do need to.** ch
5bf0: 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66  eck the value of
5c00: 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65   p->nOp-1 before
5c10: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a   continuing..*/.
5c20: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
5c30: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
5c40: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
5c50: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
5c60: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
5c70: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
5c80: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
5c90: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
5ca0: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
5cb0: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
5cc0: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
5cd0: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
5ce0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
5cf0: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
5d00: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
5d10: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
5d20: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
5d30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5d40: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5d50: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
5d60: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
5d70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
5d80: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
5d90: 30 20 29 20 72 65 74 75 72 6e 20 28 56 64 62 65  0 ) return (Vdbe
5da0: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64  Op*)&dummy;.#end
5db0: 69 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  if.    addr = p-
5dc0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
5dd0: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
5de0: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
5df0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
5e00: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
5e10: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5e20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
5e30: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
5e40: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
5e50: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
5e60: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
5e70: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5e80: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
5e90: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
5ea0: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
5eb0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
5ec0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
5ed0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
5ee0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
5ef0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
5f00: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
5f10: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
5f20: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
5f30: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
5f40: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
5f50: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
5f60: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
5f70: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
5f80: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
5f90: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
5fa0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
5fb0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
5fc0: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
5fd0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
5fe0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  se P4_KEYINFO_ST
5ff0: 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  ATIC:.    case P
6000: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
6010: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6020: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
6030: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
6040: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  KeyInfo;.      s
6050: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6060: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
6070: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
6080: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
6090: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
60a0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
60b0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
60c0: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
60d0: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
60e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
60f0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
6100: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
6110: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
6120: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
6130: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43  lite3Strlen30(pC
6140: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
6150: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
6160: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
6170: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
6180: 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29  emp[i],",...",4)
6190: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
61a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
61b0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
61c0: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
61d0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
61e0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
61f0: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
6200: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
6210: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
6220: 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  i++] = '-';.    
6230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6240: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
6250: 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  i], pColl->zName
6260: 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ,n+1);.         
6270: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20   i += n;.       
6280: 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e   }else if( i+4<n
6290: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
62a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
62b0: 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a  p[i],",nil",4);.
62c0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
62d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
62e0: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
62f0: 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  i++] = ')';.    
6300: 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a    zTemp[i] = 0;.
6310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
6320: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62  nTemp );.      b
6330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6340: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
6350: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
6360: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
6370: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
6380: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6390: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63  nTemp, zTemp, "c
63a0: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
63b0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
63c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
63d0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
63e0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
63f0: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
6400: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
6410: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6420: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6430: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
6440: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
6450: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
6460: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6470: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6490: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
64a0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
64b0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
64c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
64d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
64e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
64f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6500: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
6510: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
6520: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6530: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
6540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6550: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6560: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
6570: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
6580: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6590: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
65a0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
65b0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
65c0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  .pMem;.      ass
65d0: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
65e0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
65f0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   );.      if( pM
6600: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6610: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
6620: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
6630: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
6640: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6650: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
6660: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6670: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6680: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
6690: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
66a0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
66b0: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
66c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
66d0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
66e0: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
66f0: 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r);.      }els
6700: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
6710: 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  t( pMem->flags &
6720: 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
6730: 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f       zP4 = "(blo
6740: 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b)";.      }.   
6750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6760: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6770: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6780: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
6790: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
67a0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
67b0: 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
67c0: 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  pVtab;.      sql
67d0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
67e0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61  emp, zTemp, "vta
67f0: 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c  b:%p:%p", pVtab,
6800: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29   pVtab->pModule)
6810: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6820: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6830: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
6840: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6850: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6860: 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72  , zTemp, "intarr
6870: 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ay");.      brea
6880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6890: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
68a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
68b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
68c0: 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d   zTemp, "program
68d0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
68e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
68f0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
6900: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
6910: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
6920: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
6930: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
6940: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
6950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6960: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
6970: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
6980: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
6990: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
69a0: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
69b0: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
69c0: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
69d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
69e0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61  red statement ha
69f0: 73 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76  s to know in adv
6a00: 61 6e 63 65 20 77 68 69 63 68 20 42 74 72 65 65  ance which Btree
6a10: 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 77 69 6c 6c   objects.** will
6a20: 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74   be used so that
6a30: 20 69 74 20 63 61 6e 20 61 63 71 75 69 72 65 20   it can acquire 
6a40: 6d 75 74 65 78 65 73 20 6f 6e 20 74 68 65 6d 20  mutexes on them 
6a50: 61 6c 6c 20 69 6e 20 73 6f 72 74 65 64 0a 2a 2a  all in sorted.**
6a60: 20 6f 72 64 65 72 20 28 76 69 61 20 73 71 6c 69   order (via sqli
6a70: 74 65 33 56 64 62 65 4d 75 74 65 78 41 72 72 61  te3VdbeMutexArra
6a80: 79 45 6e 74 65 72 28 29 2e 20 20 4d 75 74 65 78  yEnter().  Mutex
6a90: 65 73 20 61 72 65 20 61 63 71 75 69 72 65 64 0a  es are acquired.
6aa0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 28 61 6e 64  ** in order (and
6ab0: 20 72 65 6c 65 61 73 65 64 20 69 6e 20 72 65 76   released in rev
6ac0: 65 72 73 65 20 6f 72 64 65 72 29 20 74 6f 20 61  erse order) to a
6ad0: 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2e 0a  void deadlocks..
6ae0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6af0: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
6b00: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
6b10: 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  int mask;.  asse
6b20: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
6b30: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69  >db->nDb && i<si
6b40: 7a 65 6f 66 28 75 33 32 29 2a 38 20 29 3b 0a 20  zeof(u32)*8 );. 
6b50: 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29   assert( i<(int)
6b60: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
6b70: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b  ask)*8 );.  mask
6b80: 20 3d 20 28 28 75 33 32 29 31 29 3c 3c 69 3b 0a   = ((u32)1)<<i;.
6b90: 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d    if( (p->btreeM
6ba0: 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
6bb0: 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61  {.    p->btreeMa
6bc0: 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
6bd0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
6be0: 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d  xArrayInsert(&p-
6bf0: 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e  >aMutex, p->db->
6c00: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d  aDb[i].pBt);.  }
6c10: 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .}...#if defined
6c20: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
6c30: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
6c40: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
6c50: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
6c60: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
6c70: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
6c80: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
6c90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6ca0: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
6cb0: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
6cc0: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
6cd0: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
6ce0: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
6cf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
6d00: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
6d10: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34   %4d %4d %4d %-4
6d20: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
6d30: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
6d40: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
6d50: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
6d60: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
6d70: 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e  (zPtr));.  fprin
6d80: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
6d90: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
6da0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
6db0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
6dc0: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
6dd0: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
6de0: 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51  p->p5,.#ifdef SQ
6df0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
6e00: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f   pOp->zComment ?
6e10: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a   pOp->zComment :
6e20: 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   "".#else.      
6e30: 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  "".#endif.  );. 
6e40: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
6e50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
6e60: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
6e70: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
6e80: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
6e90: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
6ea0: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
6eb0: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
6ec0: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a  .    Mem *pEnd;.
6ed0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
6ee0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
6ef0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
6f00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6f10: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
6f20: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
6f30: 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b      for(pEnd=&p[
6f40: 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  N]; p<pEnd; p++)
6f50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6f60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
6f70: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
6f80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
6f90: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e     }.    for(pEn
6fa0: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b  d=&p[N]; p<pEnd;
6fb0: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   p++){.      ass
6fc0: 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45  ert( (&p[1])==pE
6fd0: 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70  nd || p[0].db==p
6fe0: 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20  [1].db );..     
6ff0: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
7000: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
7010: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
7020: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7030: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
7040: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
7050: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
7060: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
7070: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
7080: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
7090: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
70a0: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
70b0: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
70c0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
70d0: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
70e0: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
70f0: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
7100: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
7110: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
7120: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
7130: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
7140: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
7150: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
7160: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
7170: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
7180: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
7190: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
71a0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
71b0: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
71c0: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
71d0: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
71e0: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
71f0: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
7200: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
7210: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
7220: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
7230: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
7240: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
7250: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
7260: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
7270: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
7280: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
7290: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
72a0: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
72b0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
72c0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
72d0: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
72e0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
72f0: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
7300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7310: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
7320: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7330: 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  ( p->zMalloc ){.
7340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7350: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
7360: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
7370: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
7380: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
7390: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
73a0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  l;.    }.    db-
73b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
73c0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
73d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
73e0: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
73f0: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
7400: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
7410: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
7420: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
7430: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
7440: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
7450: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
7460: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
7470: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
7480: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
7490: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
74a0: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
74b0: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
74c0: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
74d0: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
74e0: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
74f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
7500: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
7510: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
7520: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
7530: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
7540: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
7550: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
7560: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
7570: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
7580: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7590: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
75a0: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
75b0: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
75c0: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
75d0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
75e0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
75f0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
7600: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
7610: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
7620: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
7630: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
7640: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
7650: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
7660: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
7670: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
7680: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
7690: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
76a0: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
76b0: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
76c0: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
76d0: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
76e0: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
76f0: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
7700: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
7710: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
7720: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
7730: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
7740: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
7750: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
7760: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
7770: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
7780: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
7790: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
77a0: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
77b0: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
77c0: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
77d0: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
77e0: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
77f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
7800: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
7810: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
7820: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
7830: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
7840: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
7870: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
7880: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
7890: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78b0: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
78c0: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
78d0: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
78e0: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
78f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
7900: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
7910: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
7920: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
7940: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
7950: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
7960: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
7970: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
7980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7990: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
79a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
79b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
79e0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
79f0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7a10: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
7a20: 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65  m *pMem = p->pRe
7a30: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
7a40: 65 6d 5b 31 5d 3b 20 20 2f 2a 20 46 69 72 73 74  em[1];  /* First
7a50: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
7a60: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
7a70: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
7a80: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
7a90: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
7aa0: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
7ab0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
7ac0: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
7ad0: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
7ae0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
7af0: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
7b00: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
7b10: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
7b20: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
7b30: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
7b40: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
7b50: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
7b60: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
7b70: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
7b80: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
7b90: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
7ba0: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
7bb0: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
7bc0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
7bd0: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20  ay(pMem, 8);..  
7be0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
7bf0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
7c00: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
7c10: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
7c20: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
7c30: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
7c40: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
7c50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
7c60: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
7c70: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
7c80: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
7c90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
7ca0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
7cb0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
7cc0: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
7cd0: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
7ce0: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
7cf0: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
7d00: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
7d10: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
7d20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
7d30: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
7d40: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
7d50: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
7d60: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
7d70: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
7d80: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
7d90: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
7da0: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
7db0: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
7dc0: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
7dd0: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
7de0: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
7df0: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
7e00: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
7e10: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
7e20: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
7e30: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
7e40: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
7e50: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
7e60: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
7e70: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
7e80: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
7e90: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
7ea0: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
7eb0: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
7ec0: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
7ed0: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
7ee0: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
7ef0: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
7f00: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
7f10: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
7f20: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
7f30: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
7f40: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
7f50: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
7f60: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
7f70: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
7f80: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
7f90: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
7fa0: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
7fb0: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
7fc0: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
7fd0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
7fe0: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
7ff0: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
8000: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
8010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
8020: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
8030: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
8040: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
8050: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
8060: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
8070: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
8080: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
8090: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
80a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
80b0: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
80c0: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
80d0: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
80e0: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
80f0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
8100: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
8110: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
8120: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8130: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
8140: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
8150: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
8160: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
8170: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8180: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
8190: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
81a0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
81b0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
81c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
81d0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
81e0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
81f0: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
8200: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
8210: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
8220: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
8230: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
8240: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
8250: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
8260: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
8270: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
8280: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
8290: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
82a0: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
82b0: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
82c0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
82d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
82e0: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
82f0: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
8300: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
8310: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
8320: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
8330: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8340: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
8350: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
8360: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
8370: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
8380: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
8390: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
83a0: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
83b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
83c0: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
83d0: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
83e0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
83f0: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
8400: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8410: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
8420: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
8430: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
8440: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
8470: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
8480: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
8490: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
84a0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
84b0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
84c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
84d0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
84e0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
84f0: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
8500: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
8510: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
8520: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8530: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8540: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
8550: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
8560: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
8570: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
8580: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
8590: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
85a0: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
85b0: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
85c0: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
85d0: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
85e0: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
85f0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
8600: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
8610: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
8620: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
8630: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
8640: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
8650: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
8660: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
8670: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
8680: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
8690: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
86a0: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
86b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
86c0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
86d0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
86e0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
86f0: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
8700: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
8710: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
8720: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
8730: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
8740: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
8750: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
8760: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
8770: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8780: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
8790: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
87a0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
87b0: 20 6e 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20   nByte, 1) ){.  
87c0: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
87d0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
87e0: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
87f0: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
8800: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
8810: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
8820: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
8830: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
8840: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
8850: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
8860: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
8870: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8880: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8890: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
88a0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
88b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
88d0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
88e0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
88f0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
8900: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
8910: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
8920: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
8930: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8950: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
8960: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8970: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
8980: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
8990: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
89a0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
89b0: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89d0: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
89e0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
89f0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
8a00: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
8a10: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
8a20: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
8a30: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
8a40: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
8a50: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
8a60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8a70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8a80: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
8a90: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8aa0: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
8ab0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
8ac0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
8ad0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
8ae0: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
8af0: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
8b00: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
8b10: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
8b20: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
8b30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b40: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8b50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8b60: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8b70: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8b80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8b90: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8ba0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
8bb0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
8bc0: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
8bd0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8be0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
8bf0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
8c00: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
8c10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
8c20: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
8c30: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8c40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c50: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
8c60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8c70: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
8c80: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
8c90: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
8ca0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8cb0: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
8cc0: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
8cd0: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
8ce0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
8cf0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
8d00: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
8d10: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
8d20: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
8d30: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
8d40: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
8d50: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
8d60: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
8d70: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
8d80: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
8d90: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
8da0: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
8db0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
8dc0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
8dd0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
8de0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8df0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
8e00: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8e10: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d  TE_TEXT;.      }
8e20: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
8e30: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    {.        pMem
8e40: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
8e50: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
8e70: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
8e80: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8e90: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_NULL;.      
8ea0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  }.    }..    p->
8eb0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
8ec0: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
8ed0: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  );.    p->rc = S
8ee0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
8ef0: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
8f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8f10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8f20: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
8f30: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
8f40: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
8f50: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
8f60: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
8f70: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
8f80: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
8f90: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
8fa0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
8fb0: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
8fc0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
8fd0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
8fe0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
8ff0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
9000: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
9010: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
9020: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  z!=0 ){.    cons
9030: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
9040: 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65  >p4.z;.    while
9050: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
9060: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
9070: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
9080: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
9090: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
90a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
90b0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
90c0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
90d0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
90e0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
90f0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
9100: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
9110: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9120: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
9130: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
9140: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
9150: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
9160: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
9170: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9180: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
9190: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
91a0: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
91b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
91c0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
91d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
91e0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
91f0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
9200: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
9210: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
9220: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
9230: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
9240: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
9250: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
9260: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
9270: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
9280: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
9290: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
92a0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
92b0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
92c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
92d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
92e0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
92f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9300: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
9310: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
9320: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
9330: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
9340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9350: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
9360: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
9370: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
9380: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
9390: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
93a0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
93b0: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
93c0: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
93d0: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
93e0: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
93f0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
9400: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
9410: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
9420: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
9430: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
9440: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
9450: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
9460: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
9470: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
9480: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
9490: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
94a0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
94b0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
94c0: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
94d0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
94e0: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
94f0: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
9500: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
9510: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
9520: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
9530: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
9540: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
9550: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
9560: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
9570: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9580: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
9590: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
95a0: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
95b0: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
95c0: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
95d0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
95e0: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
95f0: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
9600: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
9610: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
9620: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
9630: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
9640: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
9650: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
9660: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
9670: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
9680: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
9690: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
96a0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
96b0: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
96c0: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
96d0: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
96e0: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
96f0: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
9700: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
9710: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
9720: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
9730: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
9740: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
9750: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
9760: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
9770: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
9780: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
9790: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
97a0: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
97b0: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
97c0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
97d0: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
97e0: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
97f0: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
9800: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9810: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
9820: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
9830: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
9840: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
9850: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
9860: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
9870: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
9880: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
9890: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
98a0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
98b0: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
98c0: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
98d0: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
98e0: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
98f0: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
9900: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
9910: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
9920: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
9930: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
9940: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
9950: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
9960: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
9970: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
9980: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
9990: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
99a0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
99b0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
99c0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
99d0: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
99e0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
99f0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
9a00: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
9a10: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
9a20: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
9a30: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
9a40: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
9a50: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
9a60: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
9a70: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
9a80: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
9a90: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
9aa0: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
9ab0: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20  AGIC_RUN..**.** 
9ac0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
9ad0: 79 20 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65  y be called more
9ae0: 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20   than once on a 
9af0: 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d  single virtual m
9b00: 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66  achine..** The f
9b10: 69 72 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64  irst call is mad
9b20: 65 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e  e while compilin
9b30: 67 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  g the SQL statem
9b40: 65 6e 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a  ent. Subsequent.
9b50: 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  ** calls are mad
9b60: 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  e as part of the
9b70: 20 70 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65   process of rese
9b80: 74 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e  tting a statemen
9b90: 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78  t to be.** re-ex
9ba0: 65 63 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63  ecuted (from a c
9bb0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  all to sqlite3_r
9bc0: 65 73 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61  eset()). The nVa
9bd0: 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72  r, nMem, nCursor
9be0: 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61   .** and isExpla
9bf0: 69 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  in parameters ar
9c00: 65 20 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f  e only passed co
9c10: 72 72 65 63 74 20 76 61 6c 75 65 73 20 74 68 65  rrect values the
9c20: 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74   first time.** t
9c30: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  he function is c
9c40: 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71  alled. On subseq
9c50: 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d  uent calls, from
9c60: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
9c70: 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73  , nVar.** is pas
9c80: 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c  sed -1 and nMem,
9c90: 20 6e 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45   nCursor and isE
9ca0: 78 70 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70  xplain are all p
9cb0: 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76  assed zero..*/.v
9cc0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
9cd0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
9ce0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9d00: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
9d10: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
9d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9d30: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
9d40: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
9d50: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
9d60: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
9d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9d80: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
9d90: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
9da0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9dd0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
9de0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ate */.  int nAr
9df0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
9e00: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
9e10: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
9e20: 73 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 73  s in SubPrograms
9e30: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
9e40: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
9e50: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
9e60: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
9e70: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
9e80: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73 53 74 6d  */.  int usesStm
9e90: 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20  tJournal        
9ea0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
9eb0: 65 74 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74  et Vdbe.usesStmt
9ec0: 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20  Journal */.){.  
9ed0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
9ee0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
9ef0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
9f00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
9f10: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
9f20: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
9f30: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
9f40: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
9f50: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9f60: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
9f70: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
9f80: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
9f90: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
9fa0: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
9fb0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
9fc0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
9fd0: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
9fe0: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
9ff0: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
a000: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
a010: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
a020: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
a030: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
a040: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
a050: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
a060: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
a070: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
a080: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
a090: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
a0a0: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
a0b0: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
a0c0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
a0d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a0e0: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
a0f0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
a100: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
a110: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
a120: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
a130: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
a140: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
a150: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
a160: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
a170: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
a180: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
a190: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
a1a0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
a1b0: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
a1c0: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
a1d0: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
a1e0: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
a1f0: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
a200: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
a210: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20  n arguments in. 
a220: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e  This is only don
a230: 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  e the.  ** first
a240: 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74   time this funct
a250: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ion is called fo
a260: 72 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20  r a given VDBE, 
a270: 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20  not when it is. 
a280: 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   ** being called
a290: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
a2a0: 73 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74  set() to reset t
a2b0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a2c0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
a2d0: 56 61 72 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Var>=0 && ALWAYS
a2e0: 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
a2f0: 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75 38 20  d==0) ){.    u8 
a300: 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a 29 26 70  *zCsr = (u8 *)&p
a310: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
a320: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
a330: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
a340: 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 75 38  oation */.    u8
a350: 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29 26   *zEnd = (u8 *)&
a360: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c  p->aOp[p->nOpAll
a370: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
a380: 79 74 65 20 70 61 73 74 20 61 76 61 69 6c 61 62  yte past availab
a390: 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  le mem */.    in
a3a0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3c0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
a3d0: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 6e  h extra memory n
a3e0: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 20 20 72 65  eeded */..    re
a3f0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
a400: 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e   &nArg);.    p->
a410: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a420: 3d 20 28 75 38 29 75 73 65 73 53 74 6d 74 4a 6f  = (u8)usesStmtJo
a430: 75 72 6e 61 6c 3b 0a 20 20 20 20 69 66 28 20 69  urnal;.    if( i
a440: 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  sExplain && nMem
a450: 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65  <10 ){.      nMe
a460: 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  m = 10;.    }.  
a470: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
a480: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
a490: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
a4a0: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20  - (u8*)0)&7;.   
a4b0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a4c0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
a4d0: 73 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  sr) );..    /* M
a4e0: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
a4f0: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
a500: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
a510: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
a520: 6f 0a 20 20 20 20 2a 2a 20 70 61 73 73 65 73 2e  o.    ** passes.
a530: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
a540: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
a550: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
a560: 65 20 61 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  e at the .    **
a570: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
a580: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
a590: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
a5a0: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
a5b0: 79 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  y.    ** require
a5c0: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
a5d0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
a5e0: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
a5f0: 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70   second.    ** p
a600: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
a610: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
a620: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
a630: 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  on.  .    **.   
a640: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
a650: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
a660: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
a670: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
a680: 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  e from.    ** th
a690: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
a6a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
a6b0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
a6c0: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
a6d0: 79 0a 20 20 20 20 2a 2a 20 72 65 64 75 63 65 20  y.    ** reduce 
a6e0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
a6f0: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
a700: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a710: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  t..    */.    do
a720: 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d   {.      nByte =
a730: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65   0;.      p->aMe
a740: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
a750: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
a760: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
a770: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a780: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
a790: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
a7a0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
a7b0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
a7c0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
a7d0: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
a7e0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
a7f0: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
a800: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
a810: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
a820: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
a830: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
a840: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
a850: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
a860: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
a870: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
a880: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
a890: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
a8a0: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
a8d0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a8e0: 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 20        if( nByte 
a8f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 46  ){.        p->pF
a900: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
a910: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
a920: 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  yte);.      }.  
a930: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
a940: 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20  ree;.      zEnd 
a950: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
a960: 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74      }while( nByt
a970: 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  e && !db->malloc
a980: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70  Failed );..    p
a990: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36  ->nCursor = (u16
a9a0: 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  )nCursor;.    if
a9b0: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
a9c0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
a9d0: 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 20 20  Var)nVar;.      
a9e0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
a9f0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
aa00: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
aa10: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
aa20: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
aa30: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
aa40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
aa50: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70  >aMem ){.      p
aa60: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa80: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
aa90: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
aaa0: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
aab0: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
aac0: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
aad0: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
aae0: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31  */.      for(n=1
aaf0: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
ab00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
ab10: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
ab20: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
ab30: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
ab40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ab50: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
ab60: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d  E_DEBUG.  for(n=
ab70: 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  1; n<p->nMem; n+
ab80: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
ab90: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64  p->aMem[n].db==d
aba0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
abb0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
abc0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
abd0: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
abe0: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
abf0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
ac00: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
ac10: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
ac20: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
ac30: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
ac40: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
ac50: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
ac60: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
ac70: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
ac80: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
ac90: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
aca0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
acb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
acc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
acd0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
ace0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
acf0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  0;.      p->aOp[
ad00: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
ad10: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
ad20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ad30: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
ad40: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
ad50: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
ad60: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
ad70: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
ad80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
ad90: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
ada0: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
adb0: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
adc0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
add0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
ade0: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
adf0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
ae00: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
ae10: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
ae20: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
ae30: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
ae40: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
ae50: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
ae60: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
ae70: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
ae80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
ae90: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
aea0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
aeb0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
aec0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
aed0: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
aee0: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
aef0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
af00: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
af10: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
af20: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
af30: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
af40: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e  *pModule = pCx->
af50: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
af60: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
af70: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
af80: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
af90: 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  r);.    p->inVta
afa0: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
afb0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
afc0: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
afd0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
afe0: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
aff0: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
b000: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
b010: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
b020: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
b030: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
b040: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
b050: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
b060: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
b070: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
b080: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
b090: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
b0a0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
b0b0: 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70  ame->v;.  v->aOp
b0c0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
b0d0: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
b0e0: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
b0f0: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
b100: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
b110: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
b120: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
b130: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
b140: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
b150: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
b160: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
b170: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
b180: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
b190: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
b1a0: 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
b1b0: 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
b1c0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
b1d0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
b1e0: 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
b1f0: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
b200: 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
b210: 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
b220: 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
b230: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
b240: 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
b250: 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
b260: 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
b270: 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
b280: 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
b290: 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
b2a0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
b2b0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
b2c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
b2d0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
b2e0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
b2f0: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
b300: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20  beFrame *pFrame 
b310: 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20  = p->pFrame;.   
b320: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
b330: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
b340: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
b350: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
b360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b370: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
b380: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
b390: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
b3a0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
b3b0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
b3c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
b3d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
b3e0: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
b3f0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
b400: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
b410: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
b420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b430: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
b440: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
b450: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
b460: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b470: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
b480: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
b490: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
b4a0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
b4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
b4c0: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
b4d0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
b4e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
b4f0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
b500: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
b510: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
b520: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
b530: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
b540: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
b550: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
b560: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
b570: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
b580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b590: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
b5a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
b5b0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
b5c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
b5d0: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
b5e0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
b5f0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
b600: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
b610: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
b620: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
b630: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
b640: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
b650: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
b660: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
b670: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
b680: 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e  >apCsr==0 || p->
b690: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
b6a0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
b6b0: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
b6c0: 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c  t( p->aMem==0 ||
b6d0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
b6e0: 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23  s==MEM_Null );.#
b6f0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
b700: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
b710: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
b720: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
b730: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
b740: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b750: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
b760: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
b770: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
b780: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
b790: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
b7a0: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
b7b0: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
b7c0: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
b7d0: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
b7e0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
b7f0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
b800: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
b810: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
b820: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
b830: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
b840: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
b850: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
b860: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
b870: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
b880: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
b890: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
b8a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
b8b0: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
b8c0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
b8d0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
b8e0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
b8f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b900: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
b910: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
b920: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
b930: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
b940: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
b950: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
b960: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
b970: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
b980: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
b990: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
b9a0: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
b9b0: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
b9c0: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
b9d0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
b9e0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
b9f0: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
ba00: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
ba10: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
ba20: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
ba30: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
ba40: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
ba50: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
ba60: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
ba70: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
ba80: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
ba90: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
baa0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
bab0: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
bac0: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
bad0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
bae0: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
baf0: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
bb00: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
bb10: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
bb20: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
bb30: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
bb40: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
bb50: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
bb60: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
bb70: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
bb80: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
bb90: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
bba0: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
bbb0: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
bbc0: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
bbd0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
bbe0: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
bc10: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
bc20: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bc50: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
bc60: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
bc70: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
bca0: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
bcb0: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
bcc0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
bcd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
bce0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
bcf0: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
bd00: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
bd10: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
bd20: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
bd30: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
bd40: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
bd50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
bd60: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
bd70: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
bd80: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
bd90: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
bda0: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
bdb0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
bdc0: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
bdd0: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
bde0: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
bdf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
be00: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
be10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
be20: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
be30: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
be40: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
be50: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
be60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
be70: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
be80: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
be90: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
bea0: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
beb0: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
bec0: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
bed0: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
bee0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
bf00: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
bf10: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
bf20: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
bf30: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
bf40: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
bf50: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
bf60: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
bf70: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
bf80: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
bf90: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
bfa0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
bfb0: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
bfc0: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
bfd0: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
bfe0: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
bff0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
c000: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
c010: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
c020: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
c030: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
c040: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
c050: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
c060: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
c070: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
c080: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c090: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
c0a0: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
c0b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
c0c0: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
c0d0: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
c0e0: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
c0f0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
c100: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
c110: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
c120: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
c130: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c140: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
c150: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
c160: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
c170: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
c180: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
c190: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
c1a0: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
c1b0: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
c1c0: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
c1d0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
c1e0: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
c1f0: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
c200: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c210: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
c220: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
c230: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
c240: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
c250: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
c260: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
c270: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
c280: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
c290: 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  (db, &p->zErrMsg
c2a0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
c2b0: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
c2c0: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
c2d0: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
c2e0: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
c2f0: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
c300: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
c310: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
c320: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
c330: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
c340: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
c350: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
c360: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
c370: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
c380: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
c390: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
c3a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
c3b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
c3c0: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
c3d0: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
c3e0: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
c3f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
c400: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
c410: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
c420: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
c430: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
c440: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
c450: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
c460: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
c470: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
c480: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
c490: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63  rans++;.      rc
c4a0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
c4b0: 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c  xclusiveLock(sql
c4c0: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
c4d0: 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Bt));.    }.  }.
c4e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c4f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
c500: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
c510: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
c520: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
c530: 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
c540: 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
c550: 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
c560: 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
c570: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
c580: 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
c590: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
c5a0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
c5b0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c5c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c5d0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
c5e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
c5f0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
c600: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
c610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
c620: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
c630: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
c640: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
c650: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
c660: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
c670: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
c680: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
c690: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
c6a0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
c6b0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
c6c0: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
c6d0: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
c6e0: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
c6f0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
c700: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
c710: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
c720: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
c730: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
c740: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
c750: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
c760: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
c770: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
c780: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
c790: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
c7a0: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
c7b0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
c7c0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
c7d0: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
c7e0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
c7f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
c800: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
c810: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
c820: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
c830: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
c840: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
c850: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
c860: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
c870: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
c880: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
c890: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
c8a0: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
c8b0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
c8c0: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
c8d0: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
c8e0: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
c8f0: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
c900: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
c910: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
c920: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
c930: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
c940: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
c950: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
c960: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
c970: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
c980: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
c990: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
c9a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
c9b0: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
c9c0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
c9d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
c9e0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
c9f0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
ca00: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
ca10: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
ca20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ca30: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ca40: 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20  PhaseTwo(pBt);. 
ca50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ca60: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ca70: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
ca80: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
ca90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
caa0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
cab0: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
cac0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
cad0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
cae0: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
caf0: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
cb00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
cb10: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
cb20: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
cb30: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
cb40: 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  cly..  */.#ifnde
cb50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
cb60: 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
cb70: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
cb80: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
cb90: 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
cba0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
cbb0: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
cbc0: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
cbd0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cbe0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
cbf0: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
cc00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
cc10: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
cc20: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
cc30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
cc40: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
cc50: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
cc60: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f   int res;..    /
cc70: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
cc80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cc90: 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a  ame */.    do {.
cca0: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
ccb0: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
ccc0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
ccd0: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
cce0: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
ccf0: 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
cd00: 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
cd10: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
cd20: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
cd30: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46  -mj%08X", zMainF
cd40: 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37  ile, iRandom&0x7
cd50: 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
cd60: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a  if( !zMaster ){.
cd70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
cd80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
cd90: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
cda0: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
cdb0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
cdc0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
cdd0: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
cde0: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
cdf0: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
ce00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ce10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
ce20: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
ce30: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
ce40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ce50: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
ce60: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
ce70: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
ce80: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
ce90: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
cea0: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
ceb0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
cec0: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
ced0: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
cee0: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
cef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cf00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cf10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
cf20: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
cf30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cf40: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
cf50: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
cf60: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
cf70: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
cf80: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
cf90: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
cfa0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cfb0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
cfc0: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
cfd0: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
cfe0: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
cff0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d000: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
d010: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
d020: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
d030: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
d040: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
d050: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
d060: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
d070: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
d080: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
d090: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
d0a0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
d0b0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
d0c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
d0d0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d0e0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
d0f0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
d100: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
d110: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
d120: 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
d130: 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
d140: 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
d150: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
d160: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
d170: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
d180: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
d190: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
d1a0: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
d1b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
d1c0: 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
d1d0: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
d1e0: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
d1f0: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
d200: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
d210: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
d220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d230: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
d240: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
d250: 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
d260: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
d270: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
d280: 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
d290: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
d2a0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
d2b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d2c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d2d0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
d2e0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
d2f0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
d300: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
d310: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
d320: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d330: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
d340: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d350: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d360: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
d370: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
d380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
d390: 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
d3a0: 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
d3b0: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
d3c0: 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
d3d0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
d3e0: 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
d3f0: 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
d400: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
d410: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
d420: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
d430: 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
d440: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
d450: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
d460: 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
d470: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
d480: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
d490: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
d4a0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
d4b0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
d4c0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
d4d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d4e0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
d4f0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
d500: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
d510: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
d520: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
d530: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
d540: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
d550: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
d560: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d570: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
d580: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
d590: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
d5a0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
d5b0: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
d5c0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
d5d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
d5e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
d5f0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
d600: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
d610: 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
d620: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
d630: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
d640: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
d650: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
d660: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
d670: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
d680: 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
d690: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
d6a0: 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
d6b0: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
d6c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d6d0: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
d6e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
d6f0: 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
d700: 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
d710: 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
d720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
d730: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d740: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
d750: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
d760: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
d770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
d780: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d790: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
d7a0: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
d7b0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
d7c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d7d0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
d7e0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
d7f0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
d800: 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
d810: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
d830: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
d840: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d850: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
d860: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
d870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d880: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
d890: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
d8a0: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
d8b0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
d8c0: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
d8d0: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
d8e0: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
d8f0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
d900: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
d910: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
d920: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
d930: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
d940: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
d950: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
d960: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
d970: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
d980: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d990: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
d9a0: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
d9b0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
d9c0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
d9d0: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
d9e0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
d9f0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
da00: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
da10: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
da20: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
da30: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
da40: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
da50: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
da60: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
da70: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
da80: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
da90: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
daa0: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
dab0: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
dac0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
dad0: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
dae0: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
daf0: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
db00: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
db10: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
db20: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
db30: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
db40: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
db50: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
db60: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
db70: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
db80: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
db90: 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
dba0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
dbb0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
dbc0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
dbd0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
dbe0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
dbf0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
dc00: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
dc10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dc20: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
dc30: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
dc40: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
dc50: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
dc60: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
dc70: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
dc80: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
dc90: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
dca0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
dcb0: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
dcc0: 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74  e3.activeVdbeCnt
dcd0: 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
dce0: 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
dcf0: 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
dd00: 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
dd10: 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
dd20: 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
dd30: 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
dd40: 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
dd50: 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
dd60: 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
dd70: 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
dd80: 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
dd90: 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
dda0: 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
ddb0: 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
ddc0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
ddd0: 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
dde0: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
ddf0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
de00: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
de10: 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
de20: 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
de30: 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
de40: 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
de50: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
de60: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
de70: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
de80: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
de90: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
dea0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
deb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
dec0: 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
ded0: 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ite++;.    }.   
dee0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
def0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
df00: 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ==db->activeVdbe
df10: 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Cnt );.  assert(
df20: 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69   nWrite==db->wri
df30: 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  teVdbeCnt );.}.#
df40: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
df50: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
df60: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
df70: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
df80: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
df90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
dfa0: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
dfb0: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
dfc0: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
dfd0: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
dfe0: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
dff0: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
e000: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
e010: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
e020: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
e030: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
e040: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
e050: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
e060: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
e070: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
e080: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
e090: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
e0a0: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
e0b0: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
e0c0: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
e0d0: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
e0e0: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
e0f0: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
e100: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
e110: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
e120: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
e130: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
e140: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
e150: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
e160: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
e170: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
e180: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
e190: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
e1a0: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
e1b0: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
e1c0: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
e1d0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
e1e0: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
e1f0: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
e200: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
e210: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
e220: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73  used again..*/.s
e230: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
e240: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
e250: 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c  difiedBtrees(sql
e260: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
e270: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
e280: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
e290: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
e2a0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e2b0: 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69     if( p && sqli
e2c0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
e2d0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(p) ){.      sq
e2e0: 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
e2f0: 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49  lCursors(p, SQLI
e300: 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d  TE_ABORT);.    }
e310: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
e320: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
e330: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
e340: 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
e350: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
e360: 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
e370: 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
e380: 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
e390: 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
e3a0: 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
e3b0: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
e3c0: 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
e3d0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
e3e0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
e3f0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
e400: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
e410: 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
e420: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
e430: 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
e440: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
e450: 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a  s commtted..**.*
e460: 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
e470: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
e480: 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
e490: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
e4a0: 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
e4b0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
e4c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
e4d0: 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
e4e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
e4f0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
e500: 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
e510: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e520: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
e530: 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
e540: 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
e550: 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
e560: 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
e570: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
e580: 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
e590: 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
e5a0: 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
e5b0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
e5c0: 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
e5d0: 79 20 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20  y have occured, 
e5e0: 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67  causing an emerg
e5f0: 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ency rollback.. 
e600: 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
e610: 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74   (db->nStatement
e620: 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20  ==0), and there 
e630: 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  is nothing to do
e640: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
e650: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
e660: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
e670: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
e680: 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
e690: 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
e6a0: 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65  ent-1;..    asse
e6b0: 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
e6c0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
e6d0: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
e6e0: 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65  LEASE);.    asse
e6f0: 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
e700: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  nt>0 );.    asse
e710: 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
e720: 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  t==(db->nStateme
e730: 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
e740: 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  t) );..    for(i
e750: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
e760: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
e770: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
e780: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
e790: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
e7a0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
e7b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
e7c0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
e7d0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
e7e0: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
e7f0: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
e800: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
e810: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
e820: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
e830: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
e840: 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2==SQLITE_OK ){.
e850: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
e860: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
e870: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
e880: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
e890: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
e8a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e8b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e8c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
e8d0: 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc2;.        }.
e8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e8f0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
e900: 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74  --;.    p->iStat
e910: 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ement = 0;..    
e920: 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
e930: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
e940: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
e950: 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
e960: 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  re the .    ** d
e970: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
e980: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
e990: 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74  int counter to t
e9a0: 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20  he value it had 
e9b0: 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  when .    ** the
e9c0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
e9d0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
e9e0: 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  d.  */.    if( e
e9f0: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
ea00: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
ea10: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
ea20: 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43  s = p->nStmtDefC
ea30: 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ons;.    }.  }. 
ea40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ea50: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
ea60: 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75  s compiled to su
ea70: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
ea80: 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62  he mode and to b
ea90: 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a  e threadsafe,.**
eaa0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62   this routine ob
eab0: 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20  tains the mutex 
eac0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ead0: 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74  each BtShared st
eae0: 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20  ructure.** that 
eaf0: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
eb00: 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
eb10: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
eb20: 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 0a   In doing so it.
eb30: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
eb40: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
eb50: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
eb60: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
eb70: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
eb80: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
eb90: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
eba0: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
ebb0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
ebc0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
ebd0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
ebe0: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
ebf0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
ec00: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
ec10: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
ec20: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
ec30: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
ec40: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
ec50: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
ec60: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
ec70: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
ec80: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
ec90: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
eca0: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 20 4f  d with the VM. O
ecb0: 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79 20 61 20  f course only a 
ecc0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 73 65 20  subset of these 
ecd0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 77 69  structures.** wi
ece0: 6c 6c 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ll be accessed b
ecf0: 79 20 74 68 65 20 56 4d 2c 20 61 6e 64 20 77 65  y the VM, and we
ed00: 20 63 6f 75 6c 64 20 75 73 65 20 56 64 62 65 2e   could use Vdbe.
ed10: 62 74 72 65 65 4d 61 73 6b 20 74 6f 20 66 69 67  btreeMask to fig
ed20: 75 72 65 0a 2a 2a 20 74 68 61 74 20 73 75 62 73  ure.** that subs
ed30: 65 74 20 6f 75 74 2c 20 62 75 74 20 74 68 65 72  et out, but ther
ed40: 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67  e is no advantag
ed50: 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a  e to doing so..*
ed60: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
ed70: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
ed80: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
ed90: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
eda0: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
edb0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
edc0: 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  o-op..*/.#ifndef
edd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
ede0: 52 45 44 5f 43 41 43 48 45 0a 76 6f 69 64 20 73  RED_CACHE.void s
edf0: 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41  qlite3VdbeMutexA
ee00: 72 72 61 79 45 6e 74 65 72 28 56 64 62 65 20 2a  rrayEnter(Vdbe *
ee10: 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  p){.#if SQLITE_T
ee20: 48 52 45 41 44 53 41 46 45 0a 20 20 73 71 6c 69  HREADSAFE.  sqli
ee30: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
ee40: 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74  ayEnter(&p->aMut
ee50: 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  ex);.#else.  sql
ee60: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
ee70: 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e 64 69 66  l(p->db);.#endif
ee80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ee90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
eea0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
eeb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
eec0: 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
eed0: 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
eee0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
eef0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
ef00: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
ef10: 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
ef20: 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
ef30: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
ef40: 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
ef50: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
ef60: 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
ef70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
ef80: 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
ef90: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
efa0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
efb0: 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
efc0: 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
efd0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
efe0: 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
eff0: 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
f000: 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
f010: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
f020: 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20  NT and write.** 
f030: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
f040: 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
f050: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
f060: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
f070: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
f080: 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
f090: 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
f0a0: 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
f0b0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
f0c0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
f0d0: 20 28 64 65 66 65 72 72 65 64 20 26 26 20 64 62   (deferred && db
f0e0: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e  ->nDeferredCons>
f0f0: 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64  0) || (!deferred
f100: 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
f110: 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20 70  aint>0) ){.    p
f120: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
f130: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d  NSTRAINT;.    p-
f140: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
f150: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
f160: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
f170: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
f180: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
f190: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
f1a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f1b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
f1c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f1d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f1e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f1f0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
f200: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
f210: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
f220: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
f230: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
f240: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
f250: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
f260: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
f270: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
f280: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
f290: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
f2a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f2b0: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
f2c0: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
f2d0: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
f2e0: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
f2f0: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
f300: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
f310: 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
f320: 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
f330: 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
f340: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
f350: 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
f360: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
f370: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
f380: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
f390: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
f3a0: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
f3b0: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
f3c0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
f3d0: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
f3e0: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
f3f0: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
f400: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
f410: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
f420: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
f430: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
f440: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
f450: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f470: 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
f480: 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
f490: 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
f4a0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
f4b0: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
f4c0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
f4d0: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
f4e0: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
f4f0: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
f500: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
f510: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
f520: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
f530: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
f540: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
f550: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
f560: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
f570: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
f580: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
f590: 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
f5a0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
f5b0: 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
f5c0: 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
f5d0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
f5e0: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
f5f0: 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
f600: 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
f610: 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
f620: 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
f630: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
f640: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
f650: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
f660: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
f670: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
f680: 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
f690: 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
f6a0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
f6b0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
f6c0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f6d0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
f6e0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
f6f0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
f700: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f710: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
f720: 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
f730: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
f740: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
f750: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f760: 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
f770: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
f780: 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
f790: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
f7a0: 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
f7b0: 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
f7c0: 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  d */.  if( p->pc
f7d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  >=0 ){.    int m
f7e0: 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
f7f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
f800: 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e   p->rc */.    in
f810: 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d  t eStatementOp =
f820: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70   0;.    int isSp
f830: 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
f840: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
f850: 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63   true if a 'spec
f860: 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20  ial' error */.. 
f870: 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
f880: 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
f890: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
f8a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
f8b0: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 70 29  texArrayEnter(p)
f8c0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
f8d0: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
f8e0: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
f8f0: 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
f900: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73 73   & 0xff;.    ass
f910: 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
f920: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
f930: 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72 72   );  /* This err
f940: 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69  or no longer exi
f950: 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70 65  sts */.    isSpe
f960: 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
f970: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
f980: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
f990: 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
f9a0: 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
f9b0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
f9c0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
f9d0: 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
f9e0: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
f9f0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fa00: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
fa10: 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
fa20: 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
fa30: 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
fa40: 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
fa50: 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
fa60: 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
fa70: 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
fa80: 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
fa90: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
faa0: 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
fab0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
fac0: 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
fad0: 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
fae0: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
faf0: 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
fb00: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
fb10: 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
fb20: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
fb30: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
fb40: 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
fb50: 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
fb60: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
fb70: 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
fb80: 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 69 6c 65  ** occured while
fb90: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
fba0: 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
fbb0: 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
fbc0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
fbd0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
fbe0: 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
fbf0: 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
fc00: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
fc10: 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
fc20: 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
fc30: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
fc40: 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
fc50: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
fc60: 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
fc70: 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
fc80: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
fc90: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
fca0: 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
fcb0: 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
fcc0: 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
fcd0: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
fce0: 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
fcf0: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
fd00: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
fd10: 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
fd20: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
fd30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
fd40: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
fd50: 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
fd60: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
fd70: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
fd80: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
fd90: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
fda0: 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
fdb0: 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
fdc0: 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
fdd0: 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
fde0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fdf0: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
fe00: 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
fe10: 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
fe20: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
fe30: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
fe40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
fe50: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
fe60: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
fe70: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
fe80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fe90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
fea0: 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
feb0: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
fec0: 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
fed0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
fee0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fef0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
ff00: 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
ff10: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
ff20: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
ff30: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
ff40: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
ff50: 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
ff60: 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
ff70: 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
ff80: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
ff90: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
ffa0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
ffb0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
ffc0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
ffd0: 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
ffe0: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
fff0: 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
10000 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
10010 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
10020 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
10030 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
10040 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
10050 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
10060 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d  b->writeVdbeCnt=
10070 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  =(p->readOnly==0
10080 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
10090 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
100a0 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f  E_OK || (p->erro
100b0 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
100c0 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72   && !isSpecialEr
100d0 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ror) ){.        
100e0 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  if( sqlite3VdbeC
100f0 68 65 63 6b 46 6b 28 70 2c 20 31 29 20 29 7b 0a  heckFk(p, 1) ){.
10100 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10110 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
10120 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78  Leave(&p->aMutex
10130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
10140 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10150 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10160 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
10170 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
10180 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72  rue, the vdbe pr
10190 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73  ogram was succes
101a0 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  sful .        **
101b0 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
101c0 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
101d0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
101e0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
101f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79  n.        ** key
10200 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
10210 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
10220 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
10230 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
10240 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
10250 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ired.  */.      
10260 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
10270 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
10280 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10290 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
102a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
102b0 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
102c0 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
102d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
102e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
102f0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
10300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10310 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
10320 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
10330 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10340 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  db);.        }el
10350 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
10360 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
10370 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
10380 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
10390 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
103a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
103b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
103c0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
103d0 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ll(db);.      }.
103e0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
103f0 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
10400 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
10410 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
10420 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10430 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
10440 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
10450 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
10460 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
10470 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
10480 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
10490 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
104a0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
104b0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
104c0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
104d0 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
104e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
104f0 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
10500 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b  ifiedBtrees(db);
10510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10520 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
10530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10540 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
10550 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
10560 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
10570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10580 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
10590 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
105a0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
105b0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
105c0 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
105d0 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
105e0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
105f0 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
10600 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
10610 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
10620 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
10630 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
10640 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
10650 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
10660 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
10670 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
10680 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
10690 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
106a0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
106b0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
106c0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
106d0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
106e0 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  at sqlite3VdbeCl
106f0 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 63  oseStatement() c
10700 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20  an only fail if 
10710 65 53 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20  eStatementOp.   
10720 20 2a 2a 20 69 73 20 53 41 56 45 50 4f 49 4e 54   ** is SAVEPOINT
10730 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 42 75 74 20  _ROLLBACK.  But 
10740 69 66 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  if p->rc==SQLITE
10750 5f 4f 4b 20 74 68 65 6e 20 65 53 74 61 74 65 6d  _OK then eStatem
10760 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20 6d 75 73  entOp.    ** mus
10770 74 20 62 65 20 53 41 56 45 50 4f 49 4e 54 5f 52  t be SAVEPOINT_R
10780 45 4c 45 41 53 45 2e 20 20 48 65 6e 63 65 20 74  ELEASE.  Hence t
10790 68 65 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d  he NEVER(p->rc==
107a0 53 51 4c 49 54 45 5f 4f 4b 29 20 69 6e 20 0a 20  SQLITE_OK) in . 
107b0 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
107c0 69 6e 67 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ing code..    */
107d0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
107e0 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
107f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
10800 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
10810 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
10820 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
10830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10840 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 53 41  eStatementOp==SA
10850 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10860 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
10870 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c  NEVER(p->rc==SQL
10880 49 54 45 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72 63  ITE_OK) || p->rc
10890 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
108a0 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  INT ){.         
108b0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
108c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
108d0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
108e0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
108f0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
10900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10910 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
10920 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
10930 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
10940 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10950 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
10960 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
10970 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
10980 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
10990 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
109a0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
109b0 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
109c0 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
109d0 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
109e0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
109f0 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
10a00 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
10a10 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
10a20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10a30 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
10a40 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
10a50 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
10a60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53   ){.      if( eS
10a70 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45  tatementOp!=SAVE
10a80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
10a90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10aa0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
10ab0 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
10ac0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10ae0 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
10af0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
10b00 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
10b10 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
10b20 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f  * Rollback or co
10b30 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20  mmit any schema 
10b40 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63  changes that occ
10b50 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  urred. */.    if
10b60 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
10b70 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26  OK && db->flags&
10b80 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
10b90 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  nges ){.      sq
10ba0 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
10bb0 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
10bc0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
10bd0 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20   = (db->flags | 
10be0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
10bf0 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nges);.    }..  
10c00 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
10c10 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
10c20 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
10c30 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
10c40 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  utex);.  }..  /*
10c50 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
10c60 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
10c70 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
10c80 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
10c90 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
10ca0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
10cb0 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b  activeVdbeCnt--;
10cc0 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
10cd0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64  dOnly ){.      d
10ce0 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d  b->writeVdbeCnt-
10cf0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  -;.    }.    ass
10d00 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56  ert( db->activeV
10d10 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74  dbeCnt>=db->writ
10d20 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a  eVdbeCnt );.  }.
10d30 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
10d40 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
10d50 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
10d60 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
10d70 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
10d80 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
10d90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10da0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
10db0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
10dc0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
10dd0 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
10de0 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
10df0 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
10e00 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
10e10 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
10e20 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
10e30 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
10e40 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
10e50 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
10e60 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
10e70 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
10e80 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
10e90 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
10ea0 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
10eb0 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
10ec0 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
10ed0 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  eCnt>0 || db->au
10ee0 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
10ef0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
10f00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
10f10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
10f20 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
10f30 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
10f40 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
10f50 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
10f60 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
10f70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
10f80 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
10f90 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
10fa0 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
10fb0 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
10fc0 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
10fd0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
10fe0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
10ff0 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
11000 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
11010 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
11020 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
11030 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
11040 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
11050 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
11060 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
11070 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
11080 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
11090 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
110a0 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
110b0 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
110c0 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
110d0 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
110e0 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
110f0 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
11100 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
11110 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
11120 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
11130 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
11140 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
11150 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
11160 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
11170 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
11180 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
11190 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
111a0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
111b0 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
111c0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
111d0 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
111e0 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
111f0 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
11200 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
11210 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
11220 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
11230 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
11240 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
11250 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
11260 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
11270 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
11280 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
11290 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
112a0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
112b0 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
112c0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
112d0 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
112e0 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
112f0 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
11300 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
11310 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
11320 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
11330 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
11340 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
11350 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11360 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
11370 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
11380 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
11390 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
113a0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
113b0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
113c0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
113d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
113e0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
113f0 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53  ,-1,p->zErrMsg,S
11400 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54  QLITE_UTF8,SQLIT
11410 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
11420 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
11430 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11440 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
11450 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73  = p->rc;.      s
11460 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11470 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
11480 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
11490 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
114a0 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
114b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
114c0 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
114d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
114e0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
114f0 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
11500 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
11510 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
11520 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
11530 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
11540 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
11550 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
11560 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
11570 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
11580 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
11590 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
115a0 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
115b0 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
115c0 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
115d0 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
115e0 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
115f0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
11600 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
11610 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
11620 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
11630 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->rc, 0);.    sq
11640 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
11650 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
11660 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
11670 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
11680 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
11690 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
116a0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
116b0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
116c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
116d0 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
116e0 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
116f0 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
11700 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
11710 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
11720 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
11730 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
11740 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
11750 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
11760 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
11770 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
11780 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
11790 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
117a0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
117b0 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
117c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
117d0 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
117e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
117f0 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
11800 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
11810 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
11820 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
11830 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11840 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
11850 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
11860 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
11870 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
11880 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
11890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
118a0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
118b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
118c0 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
118d0 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
118e0 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
118f0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
11900 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
11910 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
11920 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
11930 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
11940 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
11950 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
11960 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
11970 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
11980 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
11990 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
119a0 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
119b0 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
119c0 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
119d0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
119e0 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
119f0 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
11a00 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
11a10 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
11a20 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
11a30 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
11a40 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
11a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11a60 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
11a70 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
11a80 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
11a90 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
11aa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11ab0 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
11ac0 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
11ad0 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
11ae0 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
11af0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
11b00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11b10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  }../*.** Call th
11b20 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
11b30 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e   each auxdata en
11b40 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63  try in pVdbeFunc
11b50 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68   for which.** th
11b60 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
11b70 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63  bit in mask is c
11b80 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65  lear.  Auxdata e
11b90 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31  ntries beyond 31
11ba0 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64  .** are always d
11bb0 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65  estroyed.  To de
11bc0 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74  stroy all auxdat
11bd0 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20  a entries, call 
11be0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
11bf0 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f  with mask==0..*/
11c00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11c10 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56  eDeleteAuxData(V
11c20 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
11c30 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  nc, int mask){. 
11c40 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
11c50 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e  0; i<pVdbeFunc->
11c60 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAux; i++){.    
11c70 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a  struct AuxData *
11c80 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e  pAux = &pVdbeFun
11c90 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20  c->apAux[i];.   
11ca0 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28   if( (i>31 || !(
11cb0 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c 3c  mask&(((u32)1)<<
11cc0 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41  i))) && pAux->pA
11cd0 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ux ){.      if( 
11ce0 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
11cf0 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
11d00 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
11d10 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
11d20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30    pAux->pAux = 0
11d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11d40 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
11d50 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
11d60 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
11d70 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11d80 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20  nd argument..** 
11d90 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
11da0 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
11db0 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
11dc0 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
11dd0 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
11de0 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
11df0 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
11e00 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
11e10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
11e20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11e30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
11e40 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
11e50 65 6c 65 74 65 4f 62 6a 65 63 74 28 73 71 6c 69  eleteObject(sqli
11e60 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
11e70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
11e80 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
11e90 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
11ea0 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
11eb0 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
11ec0 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
11ed0 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
11ee0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
11ef0 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
11f00 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
11f10 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
11f20 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
11f30 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
11f40 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
11f50 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
11f60 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
11f70 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
11f80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
11f90 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
11fa0 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70    }.  vdbeFreeOp
11fb0 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
11fc0 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
11fd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11fe0 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
11ff0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12000 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
12010 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12020 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c   p->zSql);.  sql
12030 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12040 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69  ->pFree);.  sqli
12050 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
12060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
12070 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
12080 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12090 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
120a0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
120b0 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
120c0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
120d0 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
120e0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
120f0 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
12100 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
12110 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
12120 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
12130 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
12140 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
12150 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
12160 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
12170 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
12180 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
12190 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
121a0 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
121b0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56   = 0;.  sqlite3V
121c0 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28  dbeDeleteObject(
121d0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
121e0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
121f0 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
12200 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
12210 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
12220 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
12230 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
12240 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
12250 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
12260 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
12270 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
12280 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
12290 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
122a0 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
122b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
122c0 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
122d0 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
122e0 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
122f0 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
12300 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
12310 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
12320 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
12330 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
12340 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
12350 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
12360 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
12370 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
12380 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
12390 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
123a0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
123b0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
123c0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
123d0 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
123e0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
123f0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
12400 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
12410 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
12420 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
12430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12440 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
12450 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
12460 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
12470 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
12480 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
12490 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
124a0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
124b0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
124c0 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
124d0 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
124e0 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
124f0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
12500 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
12510 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
12520 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
12530 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
12540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12550 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  p->lastRowid = p
12560 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
12570 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29      if( res!=0 )
12580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12590 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
125a0 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
125b0 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
125c0 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
125d0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
125e0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
125f0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
12600 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
12610 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
12620 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65  E_STALE;.  }else
12630 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70   if( ALWAYS(p->p
12640 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69  Cursor) ){.    i
12650 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20  nt hasMoved;.   
12660 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
12670 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
12680 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  oved(p->pCursor,
12690 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20   &hasMoved);.   
126a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
126b0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73   rc;.    if( has
126c0 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70  Moved ){.      p
126d0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
126e0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
126f0 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20     p->nullRow = 
12700 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
12710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
12730 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
12740 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
12750 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
12760 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
12770 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
12780 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
12790 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
127a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
127b0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
127c0 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
127d0 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
127e0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
127f0 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
12800 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
12810 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
12820 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
12830 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
12840 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
12850 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
12860 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
12870 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
12880 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
12890 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
128a0 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
128b0 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
128c0 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
128d0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
128e0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
128f0 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
12900 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
12910 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
12920 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
12930 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
12940 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
12950 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
12960 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
12970 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
12980 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
12990 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
129a0 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
129b0 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
129c0 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
129d0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
129e0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
129f0 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72   data blob seper
12a00 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
12a10 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
12a20 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
12a30 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
12a40 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
12a50 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
12a60 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
12a70 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
12a80 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
12a90 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
12ac0 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
12ae0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
12af0 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
12b10 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
12b20 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
12b30 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
12b40 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
12b50 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
12b60 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
12b90 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
12ba0 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
12bb0 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
12bc0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
12bd0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
12c00 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
12c10 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
12c30 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
12c40 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
12c50 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
12c60 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
12c70 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
12c80 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
12cb0 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
12cc0 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
12ce0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
12cf0 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
12d00 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
12d30 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
12d40 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
12d50 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
12d60 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
12d70 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
12d80 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
12d90 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
12da0 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
12db0 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
12dc0 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
12dd0 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
12de0 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
12df0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
12e00 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
12e10 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
12e20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
12e30 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
12e40 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
12e50 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
12e60 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
12e70 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
12e80 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
12e90 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
12ea0 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
12eb0 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
12ec0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
12ed0 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
12ee0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
12ef0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
12f00 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
12f10 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
12f20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
12f30 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
12f40 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
12f50 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
12f60 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
12f70 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
12f80 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
12f90 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74   if( file_format
12fa0 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20  >=4 && (i&1)==i 
12fb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12fc0 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a  8+(u32)i;.    }.
12fd0 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69      u = i<0 ? -i
12fe0 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c   : i;.    if( u<
12ff0 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b  =127 ) return 1;
13000 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
13010 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
13020 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
13030 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
13040 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
13050 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
13060 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
13070 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
13080 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
13090 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
130a0 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
130b0 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
130c0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
130d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
130e0 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
130f0 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
13100 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
13110 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
13120 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
13130 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
13140 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
13150 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
13160 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
13170 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
13180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13190 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
131a0 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
131b0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
131c0 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
131d0 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
131e0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
131f0 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
13200 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
13210 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
13220 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
13230 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
13240 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
13250 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
13260 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
13270 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
13280 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
13290 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
132a0 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
132b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
132c0 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
132d0 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
132e0 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
132f0 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
13300 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
13310 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
13320 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
13330 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
13340 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
13350 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
13360 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
13370 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
13380 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
13390 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
133a0 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
133b0 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
133c0 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
133d0 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
133e0 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
133f0 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
13400 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
13410 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
13420 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
13430 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
13440 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
13450 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
13460 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
13470 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
13480 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
13490 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
134a0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
134b0 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
134c0 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
134d0 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
134e0 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
134f0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
13500 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
13510 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
13520 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
13530 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
13540 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
13550 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
13560 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
13570 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
13580 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
13590 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
135a0 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
135b0 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
135c0 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
135d0 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
135e0 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
135f0 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
13600 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
13610 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
13620 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
13630 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
13640 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
13650 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
13660 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
13670 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
13680 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
13690 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
136a0 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
136b0 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
136c0 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
136d0 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
136e0 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
136f0 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
13700 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
13710 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
13720 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
13730 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
13740 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
13750 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
13760 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
13770 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
13780 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
13790 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
137a0 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
137b0 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
137c0 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
137d0 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
137e0 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
137f0 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
13800 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
13810 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
13820 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
13830 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
13840 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
13850 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
13860 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
13870 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
13880 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
13890 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
138a0 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
138b0 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
138c0 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
138d0 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
138e0 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
138f0 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
13900 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
13910 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
13920 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
13930 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
13940 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
13950 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
13960 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
13970 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
13980 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
13990 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
139a0 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
139b0 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
139c0 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
139d0 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
139e0 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
139f0 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
13a00 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
13a10 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
13a20 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
13a30 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
13a40 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
13a50 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
13a60 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
13a70 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
13a80 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
13a90 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
13aa0 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
13ab0 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
13ac0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
13ad0 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
13ae0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
13af0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
13b00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
13b10 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
13b20 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
13b30 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
13b40 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
13b50 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
13b60 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
13b70 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
13b80 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
13b90 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
13ba0 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
13bb0 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
13bc0 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
13bd0 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
13be0 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
13bf0 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
13c00 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
13c10 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
13c20 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
13c30 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
13c40 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
13c50 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
13c60 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
13c70 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
13c80 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
13c90 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
13ca0 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
13cb0 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
13cc0 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
13cd0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
13ce0 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
13cf0 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
13d00 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
13d10 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
13d20 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
13d30 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
13d40 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
13d50 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
13d60 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
13d70 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
13d80 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
13d90 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
13da0 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
13db0 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
13dc0 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
13dd0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
13de0 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
13df0 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
13e00 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
13e10 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
13e20 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
13e30 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
13e40 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
13e50 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
13e60 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
13e70 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
13e80 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
13e90 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
13ea0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
13eb0 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
13ec0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
13ed0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13ee0 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
13ef0 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
13f00 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
13f10 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
13f20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
13f30 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
13f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13f50 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
13f60 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
13f70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
13f80 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
13f90 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
13fa0 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29  sert( len<=(u32)
13fb0 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c  nBuf );.    whil
13fc0 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
13fd0 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26  buf[i] = (u8)(v&
13fe0 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
13ff0 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >= 8;.    }.    
14000 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
14010 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
14020 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
14030 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
14040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
14050 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
14060 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
14070 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30  ?pMem->u.nZero:0
14080 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
14090 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
140a0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
140b0 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
140c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
140d0 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
140e0 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
140f0 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
14100 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
14110 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
14120 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
14130 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
14140 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  em->u.nZero;.   
14150 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e     assert( nBuf>
14160 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
14170 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20  len > (u32)nBuf 
14180 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
14190 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20   (u32)nBuf;.    
141a0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
141b0 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20  (&buf[pMem->n], 
141c0 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b  0, len-pMem->n);
141d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
141e0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
141f0 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
14200 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
14210 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
14220 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
14230 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
14240 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
14250 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
14260 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
14270 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
14280 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
14290 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
142a0 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
142b0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
142c0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
142d0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
142e0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
142f0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
14300 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
14310 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
14320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
14330 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
14340 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
14350 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
14360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
14370 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
14380 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
14390 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
143a0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
143b0 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
143c0 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
143d0 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
143e0 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
143f0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
14400 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
14410 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
14420 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
14430 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
14440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14450 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
14460 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
14470 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14480 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
14490 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
144a0 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
144b0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
144c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
144d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
144e0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
144f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14500 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
14510 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
14520 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
14530 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[1];.      pM
14540 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14550 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
14560 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
14570 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
14580 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
14590 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
145a0 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
145b0 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
145c0 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
145d0 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
145e0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
145f0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
14600 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
14610 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
14620 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
14630 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
14640 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30  em->u.i = (buf[0
14650 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
14660 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
14670 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
14680 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14690 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
146a0 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
146b0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
146c0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
146d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
146e0 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
146f0 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
14700 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
14710 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
14720 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
14730 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
14740 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
14750 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
14760 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
14770 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
14780 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &x;.      pMem->
14790 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
147a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
147b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
147c0 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
147d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
147e0 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
147f0 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
14800 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75  point */.      u
14810 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20  64 x;.      u32 
14820 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  y;.#if !defined(
14830 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
14840 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14850 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
14860 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
14870 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
14880 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
14890 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
148a0 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
148b0 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
148c0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
148d0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
148e0 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
148f0 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
14900 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
14910 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
14920 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
14930 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
14940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
14950 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
14960 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
14970 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
14980 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
14990 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
149a0 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
149b0 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
149c0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
149d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
149e0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
149f0 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
14a00 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
14a10 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
14a20 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
14a30 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
14a40 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
14a50 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
14a60 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
14a70 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
14a80 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
14a90 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
14aa0 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
14ab0 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
14ac0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
14ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
14ae0 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
14af0 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
14b00 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
14b10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14b20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
14b30 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
14b40 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
14b50 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  8 );.        swa
14b60 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
14b70 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  t(x);.        me
14b80 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26  mcpy(&pMem->r, &
14b90 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
14ba0 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
14bb0 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
14bc0 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d  N(pMem->r) ? MEM
14bd0 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
14be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14bf0 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
14c00 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
14c10 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
14c20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
14c30 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
14c40 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
14c50 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
14c60 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
14c70 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
14c80 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
14c90 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
14ca0 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d  .      u32 len =
14cb0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
14cc0 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
14cd0 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
14ce0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
14cf0 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
14d00 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
14d10 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
14d20 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
14d30 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14d40 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
14d50 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
14d60 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
14d70 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
14d80 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
14d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
14da0 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
14db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
14dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
14dd0 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
14de0 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
14df0 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72  d in pKey[], par
14e00 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  se the.** record
14e10 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64   into a Unpacked
14e20 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
14e30 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
14e40 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
14e50 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
14e60 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
14e70 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69  tion might provi
14e80 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73  de szSpace bytes
14e90 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70   of memory.** sp
14ea0 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20  ace at pSpace.  
14eb0 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62  This space can b
14ec0 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  e used to hold t
14ed0 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56  he returned.** V
14ee0 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20  DbeParsedRecord 
14ef0 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20  structure if it 
14f00 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e  is large enough.
14f10 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f    If it is.** no
14f20 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70  t big enough, sp
14f30 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ace is obtained 
14f40 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
14f50 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  loc()..**.** The
14f60 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74   returned struct
14f70 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ure should be cl
14f80 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  osed by a call t
14f90 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  o.** sqlite3Vdbe
14fa0 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
14fb0 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61  cord()..*/ .Unpa
14fc0 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
14fd0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
14fe0 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
14ff0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
15000 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
15010 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
15020 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
15030 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
15040 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
15050 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
15060 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
15070 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
15080 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
15090 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
150a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ,          /* Un
150b0 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
150c0 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  ailable to hold 
150d0 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
150e0 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20  int szSpace     
150f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
15100 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
15110 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  tes */.){.  cons
15120 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
15130 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
15140 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
15150 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  Key;.  UnpackedR
15160 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68  ecord *p;  /* Th
15170 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
15180 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72  d that we will r
15190 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
151a0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Byte;          /
151b0 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e  * Memory space n
151c0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c  eeded to hold p,
151d0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
151e0 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b  nt d;.  u32 idx;
151f0 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
15200 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
15210 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
15220 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
15230 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69    Mem *pMem;.  i
15240 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
15250 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70     /* Increase p
15260 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75  Space by this mu
15270 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69  ch to 8-byte ali
15280 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a  gn it */.  .  /*
15290 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  ** We want to
152a0 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
152b0 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
152c0 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
152d0 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
152e0 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
152f0 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
15300 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
15310 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
15320 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
15330 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
15340 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
15350 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
15360 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
15370 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
15380 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
15390 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
153a0 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20  ) & 7;.  pSpace 
153b0 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61  += nOff;.  szSpa
153c0 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42  ce -= nOff;.  nB
153d0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
153e0 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
153f0 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
15400 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
15410 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
15420 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a  Byte>szSpace ){.
15430 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
15440 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
15450 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
15460 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
15470 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d  return 0;.    p-
15480 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  >flags = UNPACKE
15490 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e  D_NEED_FREE | UN
154a0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
154b0 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROY;.  }else{.  
154c0 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
154d0 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20  ecord*)pSpace;. 
154e0 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
154f0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
15500 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  ROY;.  }.  p->pK
15510 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
15520 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
15530 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
15540 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d  d + 1;.  p->aMem
15550 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29   = pMem = (Mem*)
15560 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
15570 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
15580 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
15590 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
155a0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
155b0 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
155c0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
155d0 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
155e0 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
155f0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
15600 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26  && u<p->nField &
15610 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
15620 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
15630 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
15640 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
15650 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
15660 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
15670 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
15680 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
15690 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
156a0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
156b0 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  = 0;.    pMem->z
156c0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
156d0 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
156e0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
156f0 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
15700 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
15710 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d  ++;.    u++;.  }
15720 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
15730 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
15740 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c   1 );.  p->nFiel
15750 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e 20  d = u;.  return 
15760 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a  (void*)p;.}../*.
15770 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15780 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61 63  destroys a Unpac
15790 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74  kedRecord object
157a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
157b0 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
157c0 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63 6b  kedRecord(Unpack
157d0 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
157e0 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d  int i;.  Mem *pM
157f0 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  em;..  assert( p
15800 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
15810 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41   p->flags & UNPA
15820 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
15830 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Y );.  for(i=0, 
15840 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c  pMem=p->aMem; i<
15850 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20  p->nField; i++, 
15860 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  pMem++){.    /* 
15870 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  The unpacked rec
15880 6f 72 64 20 69 73 20 61 6c 77 61 79 73 20 63 6f  ord is always co
15890 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
158a0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
158b0 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28  dbeUnpackRecord(
158c0 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  ) function above
158d0 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61 6c  , which makes al
158e0 6c 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73  l.    ** strings
158f0 20 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74 69   and blobs stati
15900 63 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20  c.  And none of 
15910 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  the elements are
15920 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72 61  .    ** ever tra
15930 6e 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65  nsformed, so the
15940 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 74  re is never anyt
15950 68 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a  hing to delete..
15960 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
15970 45 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  EVER(pMem->zMall
15980 6f 63 29 20 29 20 73 71 6c 69 74 65 33 56 64 62  oc) ) sqlite3Vdb
15990 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
159a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
159b0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
159c0 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20  _NEED_FREE ){.  
159d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
159e0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  p->pKeyInfo->db,
159f0 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
15a00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15a10 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
15a20 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
15a30 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
15a40 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
15a50 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
15a60 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
15a70 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
15a80 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
15a90 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
15aa0 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
15ab0 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
15ac0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
15ad0 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
15ae0 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
15af0 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
15b00 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
15b10 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
15b20 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
15b30 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
15b40 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
15b50 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
15b60 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
15b70 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
15b80 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65  Record..**.** Ke
15b90 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
15ba0 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
15bb0 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
15bc0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a  er of fields..**
15bd0 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65   The key with fe
15be0 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73  wer fields is us
15bf0 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c  ually compares l
15c00 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a  ess than the .**
15c10 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f   longer key.  Ho
15c20 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50  wever if the UNP
15c30 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c  ACKED_INCRKEY fl
15c40 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73  ags in pPKey2 is
15c50 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20   set.** and the 
15c60 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20  common prefixes 
15c70 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
15c80 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
15c90 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66  n key2..** Or if
15ca0 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41   the UNPACKED_MA
15cb0 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20  TCH_PREFIX flag 
15cc0 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70  is set and the p
15cd0 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65  refixes are.** e
15ce0 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b  qual, then the k
15cf0 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  eys are consider
15d00 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61  ed to be equal a
15d10 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20  nd.** the parts 
15d20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  beyond the commo
15d30 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e  n prefix are ign
15d40 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
15d50 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f  he UNPACKED_IGNO
15d60 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69 73  RE_ROWID flag is
15d70 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c   set, then the l
15d80 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74  ast byte of.** t
15d90 68 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b 65  he header of pKe
15da0 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  y1 is ignored.  
15db0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
15dc0 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61  at pKey1 is.** a
15dd0 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64  n index key, and
15de0 20 74 68 75 73 20 65 6e 64 73 20 77 69 74 68 20   thus ends with 
15df0 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20  a rowid value.  
15e00 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a  The last byte.**
15e10 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 77   of the header w
15e20 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65  ill therefore be
15e30 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
15e40 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a   of the rowid:.*
15e50 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33  * one of 1, 2, 3
15e60 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72  , 4, 5, 6, 8, or
15e70 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65 72   9 - the integer
15e80 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
15e90 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  * The serial typ
15ea0 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20 72  e of the final r
15eb0 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79 73  owid will always
15ec0 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74   be a single byt
15ed0 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e  e..** By ignorin
15ee0 67 20 74 68 69 73 20 6c 61 73 74 20 62 79 74 65  g this last byte
15ef0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c 20   of the header, 
15f00 77 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6d  we force the com
15f10 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67  parison.** to ig
15f20 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20 61  nore the rowid a
15f30 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65 79  t the end of key
15f40 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
15f50 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
15f60 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
15f70 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
15f80 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
15f90 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
15fa0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
15fb0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
15fc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20  */.){.  int d1; 
15fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
15fe0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
15ff0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
16000 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
16010 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
16020 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
16030 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
16040 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
16050 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
16060 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16070 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
16080 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
16090 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
160a0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
160b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
160c0 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
160d0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
160e0 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
160f0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
16100 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
16110 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
16120 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31  pKeyInfo;.  mem1
16130 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
16140 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
16150 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
16160 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
16170 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
16180 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
16190 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
161a0 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
161b0 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  ONLY( mem1.zMall
161c0 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
161d0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
161e0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
161f0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
16200 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
16210 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
16220 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
16230 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
16240 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
16250 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
16260 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
16270 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
16280 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
16290 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
162a0 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
162b0 6c 6c 79 20 62 65 20 75 73 65 64 20 69 6e 69 74  lly be used init
162c0 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
162d0 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
162e0 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
162f0 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
16300 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
16310 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
16320 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
16330 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16340 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
16350 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
16360 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
16370 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
16380 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
16390 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
163a0 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
163b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
163c0 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
163d0 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
163e0 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
163f0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
16400 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
16410 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
16420 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
16430 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70 50  szHdr1;.  if( pP
16440 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
16450 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
16460 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64 72  WID ){.    szHdr
16470 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c  1--;.  }.  nFiel
16480 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
16490 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69  ield;.  while( i
164a0 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
164b0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
164c0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
164d0 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
164e0 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
164f0 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
16500 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
16510 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
16520 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
16530 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
16540 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
16550 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79      if( d1>=nKey
16560 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  1 && sqlite3Vdbe
16570 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
16580 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20  rial_type1)>0 ) 
16590 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45  break;..    /* E
165a0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
165b0 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
165c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
165d0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
165e0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
165f0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
16600 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
16610 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
16620 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
16630 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
16640 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
16650 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20  Key2->aMem[i],. 
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65            i<nFie
16680 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ld ? pKeyInfo->a
16690 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
166a0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
166b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
166c0 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  1.zMalloc==0 ); 
166d0 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
166e0 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20  below */..      
166f0 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65  /* Invert the re
16700 73 75 6c 74 20 69 66 20 77 65 20 61 72 65 20 75  sult if we are u
16710 73 69 6e 67 20 44 45 53 43 20 73 6f 72 74 20 6f  sing DESC sort o
16720 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rder. */.      i
16730 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
16740 72 74 4f 72 64 65 72 20 26 26 20 69 3c 6e 46 69  rtOrder && i<nFi
16750 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  eld && pKeyInfo-
16760 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
16770 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
16780 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16790 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
167a0 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
167b0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61  lag is set and a
167c0 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70 74  ll fields except
167d0 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20 20   the final.     
167e0 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20   ** rowid field 
167f0 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e  were equal, then
16800 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49   clear the PREFI
16810 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e  X_SEARCH flag an
16820 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20  d set .      ** 
16830 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f  pPKey2->rowid to
16840 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
16850 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e  e rowid field in
16860 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e   (pKey1, nKey1).
16870 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
16880 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50  s used by the OP
16890 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65  _IsUnique opcode
168a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
168b0 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c   if( (pPKey2->fl
168c0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
168d0 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26  REFIX_SEARCH) &&
168e0 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69   i==(pPKey2->nFi
168f0 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  eld-1) ){.      
16900 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d    assert( idx1==
16910 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a  szHdr1 && rc );.
16920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16930 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d  mem1.flags & MEM
16940 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  _Int );.        
16950 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d  pPKey2->flags &=
16960 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49   ~UNPACKED_PREFI
16970 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20  X_SEARCH;.      
16980 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20    pPKey2->rowid 
16990 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20  = mem1.u.i;.    
169a0 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 72    }.    .      r
169b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
169c0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
169d0 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
169e0 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
169f0 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
16a00 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
16a10 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
16a20 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
16a30 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
16a40 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
16a50 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
16a60 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
16a70 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
16a80 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
16a90 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  em1)..  */.  ass
16aa0 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
16ab0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
16ac0 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
16ad0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
16ae0 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
16af0 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
16b00 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
16b10 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
16b20 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
16b30 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  e UNPACKED_INCRK
16b40 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  EY.  ** flag is 
16b50 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20  set, then break 
16b60 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74  the tie by treat
16b70 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67  ing key2 as larg
16b80 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  er..  ** If the 
16b90 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  UPACKED_PREFIX_M
16ba0 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ATCH flag is set
16bb0 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68  , then keys with
16bc0 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
16bd0 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64  .  ** are consid
16be0 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
16bf0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
16c00 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20  e longer key is 
16c10 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72  the .  ** larger
16c20 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73  .  As it happens
16c30 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c  , the pPKey2 wil
16c40 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  l always be the 
16c50 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20 74  longer.  ** if t
16c60 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72  here is a differ
16c70 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ence..  */.  ass
16c80 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
16c90 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
16ca0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  s & UNPACKED_INC
16cb0 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20 3d  RKEY ){.    rc =
16cc0 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   -1;.  }else if(
16cd0 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
16ce0 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58   UNPACKED_PREFIX
16cf0 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a  _MATCH ){.    /*
16d00 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a   Leave rc==0 */.
16d10 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31    }else if( idx1
16d20 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 72  <szHdr1 ){.    r
16d30 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 1;.  }.  ret
16d40 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a  urn rc;.}. ../*.
16d50 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
16d60 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
16d70 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
16d80 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
16d90 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
16da0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
16db0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
16dc0 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
16dd0 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
16de0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
16df0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
16e00 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
16e10 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
16e20 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
16e30 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
16e40 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
16e50 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
16e60 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
16e70 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
16e80 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
16e90 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
16ea0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
16eb0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
16ec0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
16ed0 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
16ee0 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
16ef0 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
16f00 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
16f10 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
16f20 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
16f30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
16f40 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
16f50 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
16f60 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
16f70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
16f80 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
16f90 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
16fa0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
16fb0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55  Mem m, v;..  UNU
16fc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
16fd0 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  );..  /* Get the
16fe0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
16ff0 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
17000 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
17010 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
17020 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
17030 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
17040 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
17050 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
17060 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
17070 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
17080 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
17090 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
170a0 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
170b0 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
170c0 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
170d0 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
170e0 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
170f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
17100 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
17110 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
17120 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
17130 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
17140 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
17150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
17160 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
17170 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
17180 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
17190 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
171a0 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
171b0 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
171c0 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
171d0 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
171e0 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
171f0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
17200 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ntry */.  memset
17210 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
17220 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
17230 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
17240 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ee(pCur, 0, (int
17250 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
17260 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
17270 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17280 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
17290 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
172a0 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
172b0 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
172c0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
172d0 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
172e0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
172f0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
17300 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
17310 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
17320 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
17330 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
17340 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
17350 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
17360 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
17370 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
17380 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
17390 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
173a0 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
173b0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
173c0 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
173d0 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
173e0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
173f0 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
17400 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
17410 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17420 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
17430 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17440 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
17450 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17460 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
17470 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
17480 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17490 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
174a0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
174b0 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
174c0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
174d0 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
174e0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
174f0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
17500 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
17510 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
17520 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
17530 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
17540 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
17550 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
17560 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17570 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
17580 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
17590 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72   (u32)m.n==szHdr
175a0 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69  +lenRowid );.  i
175b0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32  f( unlikely((u32
175c0 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f  )m.n<szHdr+lenRo
175d0 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  wid) ){.    goto
175e0 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
175f0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
17600 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67   Fetch the integ
17610 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  er off the end o
17620 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
17630 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  rd */.  sqlite3V
17640 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
17650 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
17660 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
17670 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
17680 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
17690 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
176a0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
176b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
176c0 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61  ump here if data
176d0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
176e0 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65  is detected afte
176f0 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  r m has been.  *
17700 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72  * allocated.  Fr
17710 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20  ee the m object 
17720 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
17730 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64  E_CORRUPT. */.id
17740 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
17750 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20  on:.  testcase( 
17760 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  m.zMalloc!=0 );.
17770 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
17780 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
17790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
177a0 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
177b0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
177c0 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
177d0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
177e0 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
177f0 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
17800 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
17810 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
17820 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
17830 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
17840 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
17850 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
17860 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
17870 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
17880 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
17890 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
178a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
178b0 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
178c0 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
178d0 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
178e0 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
178f0 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
17900 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
17910 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
17920 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
17930 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
17940 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
17950 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
17960 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
17970 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
17980 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
17990 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
179a0 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
179b0 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
179c0 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
179d0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
179e0 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
179f0 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72  re(.  VdbeCursor
17a00 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
17a10 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
17a20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
17a30 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
17a40 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
17a50 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  d,  /* Unpacked 
17a60 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74  version of key t
17a70 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
17a80 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  t */.  int *res 
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17ab0 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
17ac0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
17ad0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
17ae0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
17af0 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
17b00 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d  ->pCursor;.  Mem
17b10 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   m;..  assert( s
17b20 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17b30 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
17b40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17b50 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
17b60 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
17b70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
17b80 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20  ITE_OK );    /* 
17b90 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
17ba0 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
17bb0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
17bc0 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
17bd0 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
17be0 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
17bf0 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
17c00 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68 61  the say.  ** tha
17c10 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
17c20 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
17c30 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
17c40 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
17c50 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
17c60 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
17c70 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
17c80 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
17c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17ca0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
17cb0 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20    memset(&m, 0, 
17cc0 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63  sizeof(m));.  rc
17cd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
17ce0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
17cf0 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29  Cursor, 0, (int)
17d00 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
17d10 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
17d20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
17d30 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70 61  .  assert( pUnpa
17d40 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e  cked->flags & UN
17d50 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
17d60 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20  WID );.  *res = 
17d70 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
17d80 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
17d90 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
17da0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
17db0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
17dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
17de0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
17df0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
17e00 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
17e10 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
17e20 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
17e30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17e40 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
17e50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
17e60 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
17e70 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
17e80 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
17e90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17ea0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
17eb0 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
17ec0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
17ed0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
17ee0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
17ef0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
17f00 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
17f10 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
17f20 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
17f30 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
17f40 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
17f50 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
17f60 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
17f70 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
17f80 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
17f90 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
17fa0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
17fb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17fc0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
17fd0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
17fe0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
17ff0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
18000 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
18010 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
18020 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
18030 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
18040 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
18050 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
18060 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
18070 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
18080 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
18090 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
180a0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
180b0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
180c0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
180d0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
180e0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
180f0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
18100 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
18110 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18120 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
18130 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
18140 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
18150 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
18160 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
18170 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
18180 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
18190 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
181a0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
181b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
181c0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
181d0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
181e0 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
181f0 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
18200 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
18210 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
18220 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18230 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
18240 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
18250 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
18260 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
18270 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
18280 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
18290 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
182a0 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
182b0 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
182c0 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
182d0 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
182e0 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
182f0 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
18300 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
18310 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
18320 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
18330 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
18340 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
18350 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
18360 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
18370 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
18380 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
18390 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
183a0 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
183b0 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20  Var, u8 aff){.  
183c0 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
183d0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
183e0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d   Mem *pMem = &v-
183f0 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20  >aVar[iVar-1];. 
18400 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d     if( 0==(pMem-
18410 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
18420 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l) ){.      sqli
18430 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20  te3_value *pRet 
18440 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
18450 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  w(v->db);.      
18460 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
18470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
18480 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52  emCopy((Mem *)pR
18490 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  et, pMem);.     
184a0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
184b0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
184c0 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  t, aff, SQLITE_U
184d0 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TF8);.        sq
184e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
184f0 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52 65  eType((Mem *)pRe
18500 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
18510 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
18520 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18530 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
18540 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
18550 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
18560 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
18570 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
18580 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
18590 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
185a0 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
185b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
185c0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
185d0 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
185e0 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
185f0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
18600 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
18610 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
18620 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
18630 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
18640 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
18650 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
18660 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
18670 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
18680 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.