/ Hex Artifact Content
Login

Artifact 0b2e2880f13af400a27c92a7673287c3eaec8b21:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
0f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f50: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f70: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0f80: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0f90: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fa0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fb0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fc0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0fd0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
0fe0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
0ff0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1010: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1020: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1040: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1050: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1060: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1070: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1080: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10a0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10b0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10c0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10d0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
10e0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
10f0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1100: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1110: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1120: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1130: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1140: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1150: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1190: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11f0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1200: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1220: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1230: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1240: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1250: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1260: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1270: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1280: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12a0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
12e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1300: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1310: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f  ../*.** Add an O
1330: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70  P_ParseSchema op
1340: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
1350: 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75  ine is broken ou
1360: 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  t from.** sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69  3VdbeAddOp4() si
1380: 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  nce it needs to 
1390: 61 6c 73 6f 20 6c 6f 63 61 6c 20 61 6c 6c 20 62  also local all b
13a0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  trees..**.** The
13b0: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
13c0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
13d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
13e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
13f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1400: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
1410: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
1420: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
1430: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
1440: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
1450: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
1460: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
1470: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61    int j;.  int a
1480: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1490: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61  eAddOp3(p, OP_Pa
14a0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
14b0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
14c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
14d0: 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34  addr, zWhere, P4
14e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
14f0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
1500: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
1510: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
1520: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
1530: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1540: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1550: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
1560: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
1570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1580: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
1590: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
15a0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
15b0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
15c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
15d0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
15e0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
15f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1600: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1610: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1620: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1630: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1640: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1650: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1660: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
1670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1680: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
1690: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
16a0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
16b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16c0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
16d0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
16e0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
16f0: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1700: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
1710: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
1720: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dr;.}../*.** Cre
1730: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
1740: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
1750: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1760: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
1770: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
1780: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
1790: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
17a0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
17b0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
17c0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
17d0: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
17e0: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
17f0: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
1800: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
1810: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
1820: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
1830: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
1840: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
1850: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
1860: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
1870: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
1880: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
1890: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
18a0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
18b0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
18c0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
18d0: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
18e0: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
18f0: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
1900: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
1910: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
1920: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
1930: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
1940: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
1950: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
1960: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
1970: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
1980: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
1990: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
19a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
19b0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
19c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
19d0: 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a   = p->nLabel++;.
19e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
19f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1a00: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  NIT );.  if( i>=
1a10: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29  p->nLabelAlloc )
1a20: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d  {.    int n = p-
1a30: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1a40: 20 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   5;.    p->aLabe
1a50: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
1a60: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
1a70: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20  , p->aLabel,.   
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e      n*sizeof(p->
1ab0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20  aLabel[0]));.   
1ac0: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
1ad0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1ae0: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  cSize(p->db, p->
1af0: 61 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70  aLabel)/sizeof(p
1b00: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20  ->aLabel[0]);.  
1b10: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
1b20: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1b30: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
1b40: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
1b50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
1b60: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
1b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1b80: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1b90: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
1ba0: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
1bb0: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
1bc0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
1bd0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
1be0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
1bf0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
1c00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c10: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1c20: 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78  l(Vdbe *p, int x
1c30: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d  ){.  int j = -1-
1c40: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
1c50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1c60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1c70: 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d  rt( j>=0 && j<p-
1c80: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1c90: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1ca0: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
1cb0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a   p->nOp;.  }.}..
1cc0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
1cd0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
1ce0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
1cf0: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
1d00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
1d10: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
1d20: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
1d30: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
1d40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1d50: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
1d60: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
1d70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1d80: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
1d90: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
1da0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1db0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
1dc0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
1dd0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
1de0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
1df0: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
1e00: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
1e10: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
1e20: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
1e30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1e40: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1e50: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
1e60: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
1e70: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
1e80: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
1e90: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
1ea0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
1ed0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
1ee0: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
1ef0: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
1f00: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
1f10: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
1f20: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
1f30: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
1f40: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
1f50: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
1f60: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1f70: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
1f80: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
1f90: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
1fa0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
1fc0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
1fd0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
1fe0: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
1ff0: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2000: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2010: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2020: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2040: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2050: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2060: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2080: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
2090: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
20a0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
20b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
20d0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
20e0: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
20f0: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2100: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2110: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2120: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2130: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2140: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2150: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2160: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2170: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2180: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
2190: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
21a0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
21b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21c0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
21d0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
21e0: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
21f0: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2200: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
2210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
2220: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
2230: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
2240: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
2250: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
2260: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
2270: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
2280: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
2290: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
22a0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
22b0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
22c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
22d0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
22e0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
22f0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
2300: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
2310: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
2320: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2330: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
2340: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
2350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2360: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
2370: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
2380: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
2390: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
23a0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
23b0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
23c0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
23d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
23e0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
23f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2400: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
2410: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
2420: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
2430: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2440: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2450: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
2460: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
2470: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
2480: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
2490: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
24a0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
24b0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
24c0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
24d0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
24e0: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
24f0: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
2500: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
2510: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
2520: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
2530: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
2540: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
2550: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
2560: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
2570: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
2580: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2590: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
25a0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
25b0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
25c0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
25d0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
25e0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
25f0: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
2600: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
2610: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
2620: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
2630: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
2640: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2650: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2660: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
2670: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
2680: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
2690: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
26a0: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
26b0: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
26c0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
26d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
26e0: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
26f0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
2700: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2710: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
2720: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
2730: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
2740: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
2750: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
2760: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
2770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
2780: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2790: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27a0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
27b0: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
27c0: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
27d0: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
27e0: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
27f0: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
2800: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56  ;.  Op *pOp;.  V
2810: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
2820: 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72  .  memset(&sIter
2830: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2840: 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d  r));.  sIter.v =
2850: 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70   v;..  while( (p
2860: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
2870: 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20  &sIter))!=0 ){. 
2880: 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20     int opcode = 
2890: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pOp->opcode;.   
28a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
28b0: 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64  Destroy || opcod
28c0: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c  e==OP_VUpdate ||
28d0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e   opcode==OP_VRen
28e0: 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ame .#ifndef SQL
28f0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
2900: 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70  _KEY.     || (op
2910: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
2920: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
2930: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20   && pOp->p2==1) 
2940: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20  .#endif.     || 
2950: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ((opcode==OP_Hal
2960: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  t || opcode==OP_
2970: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20  HaltIfNull) .   
2980: 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d     && (pOp->p1==
2990: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
29a0: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
29b0: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
29c0: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
29d0: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
29e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
29f0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
2a00: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
2a10: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
2a20: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
2a30: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
2a40: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2a50: 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66  occured..  ** If
2a60: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
2a70: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
2a80: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
2a90: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
2aa0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
2ab0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
2ac0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
2ad0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
2ae0: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
2af0: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
2b00: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
2b10: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
2b20: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
2b30: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
2b40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
2b50: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2b60: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
2b70: 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e  ayAbort );.}.#en
2b80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2b90: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
2ba0: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2bb0: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
2bc0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
2bd0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
2be0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
2bf0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
2c00: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
2c10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
2c20: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
2c30: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
2c40: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
2c50: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
2c60: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
2c70: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
2c80: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
2c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2ca0: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
2cb0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
2cc0: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
2cd0: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
2ce0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
2cf0: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
2d00: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
2d10: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
2d20: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
2d30: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
2d40: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
2d50: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
2d60: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
2d70: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
2d80: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
2d90: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
2da0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66  **.** The Op.opf
2db0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65  lags field is se
2dc0: 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73  t on all opcodes
2dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2df0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
2e00: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
2e10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
2e20: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
2e30: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
2e40: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
2e50: 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  = p->aLabel;.  p
2e60: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2e70: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
2e80: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
2e90: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
2ea0: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
2eb0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
2ec0: 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20     pOp->opflags 
2ed0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  = sqlite3OpcodeP
2ee0: 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b  roperty[opcode];
2ef0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2f00: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20  =OP_Function || 
2f10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
2f20: 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ep ){.      if( 
2f30: 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73  pOp->p5>nMaxArgs
2f40: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
2f50: 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65  p->p5;.    }else
2f60: 20 69 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50   if( (opcode==OP
2f70: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20  _Transaction && 
2f80: 70 4f 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f  pOp->p2!=0) || o
2f90: 70 63 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d  pcode==OP_Vacuum
2fa0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61   ){.      p->rea
2fb0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64  dOnly = 0;.#ifnd
2fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2fd0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2fe0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2ff0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
3000: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
3010: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
3020: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
3030: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3040: 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65  pcode==OP_VFilte
3050: 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
3060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3070: 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20  p->nOp - i >= 3 
3080: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3090: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
30a0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
30b0: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
30c0: 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  .p1;.      if( n
30d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
30e0: 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66  Args = n;.#endif
30f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
3100: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
3110: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26  OPFLG_JUMP)!=0 &
3120: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
3130: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
3140: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
3150: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
3160: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
3170: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
3180: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
3190: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
31a0: 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65  bel);.  p->aLabe
31b0: 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46  l = 0;..  *pMaxF
31c0: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
31d0: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
31e0: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
31f0: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
3200: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
3210: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
3220: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
3230: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
3240: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3250: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3260: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
3270: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
3280: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
3290: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
32a0: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
32b0: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
32c0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
32d0: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
32e0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
32f0: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
3300: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
3310: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
3320: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
3330: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
3340: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
3350: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
3360: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
3370: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
3380: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
3390: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
33a0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
33b0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
33c0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
33d0: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
33e0: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
33f0: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
3400: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
3410: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
3420: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
3430: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
3440: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
3450: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
3460: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
3470: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
3480: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
3490: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
34a0: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
34b0: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
34c0: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
34d0: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
34e0: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
34f0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
3500: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
3510: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
3520: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
3530: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
3540: 61 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65  assert( p->btree
3550: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  Mask==0 );..  re
3560: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
3570: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
3580: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
3590: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
35a0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
35b0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
35c0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
35d0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
35e0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
35f0: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
3600: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
3610: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
3620: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3630: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
3640: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
3650: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3660: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
3670: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3680: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3690: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
36a0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
36b0: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
36c0: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
36d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
36e0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
36f0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
3700: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
3710: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
3720: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
3730: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
3740: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
3750: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3760: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
3770: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
3780: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
3790: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
37a0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
37b0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
37c0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
37d0: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
37e0: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
37f0: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
3800: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
3810: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
3820: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
3830: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3840: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3850: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3870: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3880: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
3890: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
38a0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
38b0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
38c0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
38d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
38e0: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
38f0: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
3900: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
3910: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3930: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
3940: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
3950: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3960: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3970: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
3990: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
39a0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
39b0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
39c0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
39d0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
39e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
39f0: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3a00: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3a10: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3a20: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a40: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3a50: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3a60: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3a70: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3a80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3a90: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
3aa0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3ab0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3ac0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3ad0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
3ae0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3af0: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3b00: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
3b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3b20: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3b30: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
3b40: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3b50: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
3b60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3b70: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
3b80: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
3b90: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
3ba0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3bb0: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
3bc0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
3bd0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
3be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
3bf0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3c00: 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  nOp>addr ){.    
3c10: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3c20: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3c30: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3c40: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3c50: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3c60: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3c70: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3c80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3c90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3ca0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3cb0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3cc0: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3cd0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3ce0: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3cf0: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
3d00: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3d10: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3d20: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
3d30: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
3d40: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
3d50: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
3d60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3d70: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
3d80: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
3d90: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
3da0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
3db0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
3dc0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  0 );.    p->aOp[
3dd0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76  p->nOp-1].p5 = v
3de0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3df0: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
3e00: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
3e10: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
3e20: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
3e30: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
3e40: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3e50: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
3e60: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3e70: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3e80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3e90: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 64  r){.  assert( ad
3ea0: 64 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  dr>=0 );.  sqlit
3eb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
3ec0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
3ed0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
3ee0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
3ef0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
3f00: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
3f10: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
3f20: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
3f30: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
3f40: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
3f50: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
3f60: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
3f70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
3f80: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
3f90: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
3fa0: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
3fb0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
3fc0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
3fd0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3fe0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
3ff0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
4000: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4010: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
4020: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
4030: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
4040: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
4050: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
4060: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4070: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
4080: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20  ){.  if( p4 ){. 
4090: 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b     assert( db );
40a0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
40b0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
40c0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
40d0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
40e0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59        case P4_DY
40f0: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73  NAMIC:.      cas
4100: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20  e P4_KEYINFO:.  
4110: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4120: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65  RRAY:.      case
4130: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
4140: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
4150: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4160: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72   p4);.        br
4170: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4180: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
4190: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
41a0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
41b0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
41c0: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
41d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
41e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
41f0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
4200: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
4210: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
4220: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
4230: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4240: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
4250: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
4260: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4270: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4280: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
4290: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
42a0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
42b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
42c0: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
42d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
42e0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
42f0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
4300: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4310: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4320: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4330: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4340: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4350: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
4360: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4370: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4380: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4390: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
43a0: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
43b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
43c0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
43d0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
43e0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
43f0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
4400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4410: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4420: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4440: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4450: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
4460: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4470: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
4480: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
4490: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
44a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
44c0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
44d0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
44e0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
44f0: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
4500: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
4510: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
4520: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
4530: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
4540: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
4550: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
4560: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
4570: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4580: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
4590: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
45a0: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
45b0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
45c0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
45d0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
45e0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
45f0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
4600: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4610: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4620: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4630: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4640: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4650: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4660: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4670: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4680: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
4690: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
46a0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
46b0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
46c0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
46d0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
46e0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
46f0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
4700: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4710: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4720: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4730: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4740: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4750: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4760: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4770: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
4780: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
4790: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
47a0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
47b0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
47c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
47d0: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
47e0: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
47f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4800: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
4810: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
4820: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
4830: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
4840: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
4850: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
4860: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4870: 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65  p->db;.    while
4880: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66  ( N-- ){.      f
4890: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
48a0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
48b0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
48c0: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
48d0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70  Op[0]));.      p
48e0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
48f0: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b  Noop;.      pOp+
4900: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
4910: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4920: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
4930: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4940: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4950: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
4960: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
4970: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
4980: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
4990: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
49a0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
49c0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
49d0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
49e0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
49f0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
4a00: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
4a10: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
4a20: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
4a30: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
4a40: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
4a50: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
4a60: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4a70: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4a80: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
4a90: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
4aa0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
4ab0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
4ac0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
4ad0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
4ae0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
4af0: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a  ytes of zP4..**.
4b00: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49  ** If n==P4_KEYI
4b10: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
4b20: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74  t zP4 is a point
4b30: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
4b40: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
4b50: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
4b60: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
4b70: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
4b80: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
4b90: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
4ba0: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  c, to be freed w
4bb0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20  hen the Vdbe is 
4bc0: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d  finalized..** n=
4bd0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
4be0: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68  OFF indicates th
4bf0: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f  at zP4 points to
4c00: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
4c10: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ture.** stored i
4c20: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68  n memory that th
4c30: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
4c40: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4c50: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  e3_malloc. The .
4c60: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
4c70: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
4c80: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
4c90: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
4ca0: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
4cb0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
4cc0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
4cd0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
4ce0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
4cf0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
4d00: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
4d10: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
4d20: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
4d30: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
4d40: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
4d50: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
4d60: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
4d70: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
4d80: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
4d90: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
4da0: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
4db0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
4dc0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
4dd0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4de0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4df0: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
4e00: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
4e10: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
4e20: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
4e30: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
4e40: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
4e50: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
4e60: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4e70: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4e80: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
4e90: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
4ea0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
4eb0: 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n!=P4_KEYINFO 
4ec0: 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  && n!=P4_VTAB ) 
4ed0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
4ee0: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
4ef0: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
4f00: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
4f10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
4f20: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
4f30: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
4f40: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
4f50: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
4f60: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
4f70: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
4f80: 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c  r];.  freeP4(db,
4f90: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4fa0: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
4fb0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28  >p4.p = 0;.  if(
4fc0: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a   n==P4_INT32 ){.
4fd0: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
4fe0: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20  s cast is safe, 
4ff0: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
5000: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61  in data point wa
5010: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20  s an int.    ** 
5020: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f  that was cast to
5030: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   a (const char *
5040: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70  ). */.    pOp->p
5050: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  4.i = SQLITE_PTR
5060: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20  _TO_INT(zP4);.  
5070: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5080: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73  P4_INT32;.  }els
5090: 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a  e if( zP4==0 ){.
50a0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
50b0: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  0;.    pOp->p4ty
50c0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
50d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
50e0: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
50f0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
5100: 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  nfo;.    int nFi
5110: 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20  eld, nByte;..   
5120: 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49   nField = ((KeyI
5130: 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c  nfo*)zP4)->nFiel
5140: 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  d;.    nByte = s
5150: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
5160: 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69   + (nField-1)*si
5170: 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  zeof(pKeyInfo->a
5180: 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c  Coll[0]) + nFiel
5190: 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  d;.    pKeyInfo 
51a0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
51b0: 63 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a  cRaw(0, nByte);.
51c0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
51d0: 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
51e0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66  .    if( pKeyInf
51f0: 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  o ){.      u8 *a
5200: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
5210: 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70   memcpy((char*)p
5220: 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42  KeyInfo, zP4, nB
5230: 79 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20  yte - nField);. 
5240: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
5250: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
5260: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
5270: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
5280: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
5290: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
52a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
52b0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
52c0: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
52d0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
52e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
52f0: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
5300: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5310: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5320: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  4_KEYINFO;.    }
5330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
5340: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5350: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
5360: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5370: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
5380: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
5390: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
53a0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
53b0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
53c0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
53d0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73  _KEYINFO;.  }els
53e0: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42  e if( n==P4_VTAB
53f0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5400: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5410: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5420: 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73  = P4_VTAB;.    s
5430: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
5440: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20  VTable *)zP4);. 
5450: 20 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61     assert( ((VTa
5460: 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d  ble *)zP4)->db==
5470: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65  p->db );.  }else
5480: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
5490: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
54a0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
54b0: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
54c0: 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73  d char)n;.  }els
54d0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
54e0: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
54f0: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
5500: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
5510: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
5520: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
5530: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5540: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
5550: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
5560: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5570: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
5580: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5590: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
55a0: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
55b0: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
55c0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
55d0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
55e0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
55f0: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
5600: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
5610: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
5620: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
5630: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
5640: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
5650: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5660: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
5670: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5680: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
5690: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
56a0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
56b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
56c0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
56d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
56e0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
56f0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5700: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
5710: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5720: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5730: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
5740: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
5750: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  p-1].zComment;. 
5760: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5770: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  zFormat);.    sq
5780: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
5790: 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  b, *pz);.    *pz
57a0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
57b0: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
57c0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
57d0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
57e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
57f0: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
5800: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5810: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5820: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5830: 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
5840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5850: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
5860: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5870: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
5880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5890: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
58a0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
58b0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
58c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
58d0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
58e0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
58f0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
5900: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
5910: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5920: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
5930: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5940: 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d   *pz);.    *pz =
5950: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5960: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
5970: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5980: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
5990: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
59a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
59b0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
59c0: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
59d0: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
59e0: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
59f0: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
5a00: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
5a10: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
5a20: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
5a30: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
5a40: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
5a50: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
5a60: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
5a70: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
5a80: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
5a90: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
5aa0: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
5ab0: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
5ac0: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
5ad0: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
5ae0: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
5af0: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
5b00: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
5b10: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
5b20: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
5b30: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
5b40: 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20  .** after a OOM 
5b50: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
5b60: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
5b70: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
5b80: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
5b90: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
5ba0: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
5bb0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
5bc0: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
5bd0: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
5be0: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
5bf0: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
5c00: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
5c10: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
5c20: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
5c30: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20  Valgrind..**.** 
5c40: 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66  About the #ifdef
5c50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5c60: 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  CE:  Normally, t
5c70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
5c80: 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75  ever called.** u
5c90: 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20  nless p->nOp>0. 
5ca0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
5cb0: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20   in the absense 
5cc0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  of SQLITE_OMIT_T
5cd0: 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54  RACE,.** an OP_T
5ce0: 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  race instruction
5cf0: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72   is always inser
5d00: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  ted by sqlite3Vd
5d10: 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20  beGet() as soon 
5d20: 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45  as.** a new VDBE
5d30: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f   is created.  So
5d40: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20   we are free to 
5d50: 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e  set addr to p->n
5d60: 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20  Op-1 without.** 
5d70: 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65  having to double
5d80: 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73  -check to make s
5d90: 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73  ure that the res
5da0: 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  ult is non-negat
5db0: 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53  ive. But.** if S
5dc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5dd0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
5de0: 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69   OP_Trace is omi
5df0: 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e  tted and we do n
5e00: 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  eed to.** check 
5e10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
5e20: 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e  nOp-1 before con
5e30: 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65  tinuing..*/.Vdbe
5e40: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
5e50: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
5e60: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
5e70: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
5e80: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
5e90: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
5ea0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
5eb0: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
5ec0: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
5ed0: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
5ee0: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
5ef0: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
5f00: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
5f10: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f   dummy;  /* Igno
5f20: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e  re the MSVC warn
5f30: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69  ing about no ini
5f40: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73  tializer */.  as
5f50: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5f60: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5f70: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
5f80: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
5f90: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
5fa0: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20  if( p->nOp==0 ) 
5fb0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
5fc0: 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20  &dummy;.#endif. 
5fd0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
5fe0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
5ff0: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
6000: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
6010: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
6020: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
6030: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6040: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
6050: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
6060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
6070: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
6080: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  ];.  }.}..#if !d
6090: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
60a0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
60b0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
60c0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
60d0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
60e0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
60f0: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
6100: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
6110: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
6120: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
6130: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
6140: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
6150: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
6160: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
6170: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
6180: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
6190: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
61a0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
61b0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
61c0: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
61d0: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
61e0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
61f0: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
6200: 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
6210: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  :.    case P4_KE
6220: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
6230: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
6240: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
6250: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
6260: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
6270: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6280: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e  p, zTemp, "keyin
6290: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  fo(%d", pKeyInfo
62a0: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
62b0: 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
62c0: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20  en30(zTemp);.   
62d0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
62e0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
62f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
6300: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
6310: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
6320: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
6330: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
6340: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
6350: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d  3Strlen30(pColl-
6360: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
6370: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
6380: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
6390: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
63a0: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20  i],",...",4);.  
63b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
63c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
63d0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
63e0: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  ] = ',';.       
63f0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
6400: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70  >aSortOrder && p
6410: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6420: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
6430: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6440: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
6450: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
6460: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  mcpy(&zTemp[i], 
6470: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31  pColl->zName,n+1
6480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6490: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
64a0: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
64b0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
64c0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
64d0: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20  ,",nil",4);.    
64e0: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
64f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6500: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6510: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
6520: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
6530: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
6540: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
6550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6560: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
6570: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6580: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
6590: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
65a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
65b0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
65c0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
65d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
65e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
65f0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
6600: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
6610: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
6620: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
6630: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6640: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6650: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
6660: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
6670: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6680: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6690: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
66a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
66b0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
66c0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
66d0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
66e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
66f0: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
6700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6710: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6720: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
6730: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
6740: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6750: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
6760: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6770: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6780: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
6790: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
67a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
67b0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
67c0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
67d0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
67e0: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
67f0: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
6800: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a  MEM_Null)==0 );.
6810: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
6820: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
6830: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
6840: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
6850: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
6860: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
6870: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6880: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6890: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
68a0: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
68b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
68c0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
68d0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
68e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
68f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6900: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29  %.16g", pMem->r)
6910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6920: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6930: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
6940: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
6950: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
6960: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6970: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6980: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6990: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
69a0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
69b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
69c0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
69d0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
69e0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
69f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6a00: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
6a10: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
6a20: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
6a30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6a40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
6a50: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
6a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6a70: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6a80: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
6a90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6aa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6ab0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
6ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6ad0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6ae0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
6af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6b00: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6b10: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
6b20: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
6b30: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
6b40: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
6b50: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
6b60: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
6b70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6b80: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
6b90: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
6ba0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
6bb0: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
6bc0: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
6bd0: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
6be0: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
6bf0: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  ** The prepared 
6c00: 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20  statements need 
6c10: 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e  to know in advan
6c20: 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ce the complete 
6c30: 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68  set of.** attach
6c40: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ed databases tha
6c50: 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 75  t they will be u
6c60: 73 69 6e 67 2e 20 20 41 20 6d 61 73 6b 20 6f 66  sing.  A mask of
6c70: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
6c80: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
6c90: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
6ca0: 6b 20 61 6e 64 20 69 73 20 75 73 65 64 20 66 6f  k and is used fo
6cb0: 72 20 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6f 74  r locking and ot
6cc0: 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f  her purposes..*/
6cd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6ce0: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
6cf0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
6d00: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
6d10: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
6d20: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
6d30: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
6d40: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
6d50: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
6d60: 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d  8 );.  p->btreeM
6d70: 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
6d80: 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21  )1)<<i;.  if( i!
6d90: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
6da0: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
6db0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
6dc0: 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  .    p->lockMask
6dd0: 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29   |= ((yDbMask)1)
6de0: 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  <<i;.  }.}..#if 
6df0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6e00: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
6e10: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
6e20: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
6e30: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
6e40: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
6e50: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6e60: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
6e70: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
6e80: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
6e90: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
6ea0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
6eb0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
6ec0: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
6ed0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
6ee0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
6ef0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
6f00: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
6f10: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
6f20: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
6f30: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
6f40: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
6f50: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
6f60: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
6f70: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
6f80: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
6f90: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6fa0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
6fb0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
6fc0: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
6fd0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6fe0: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
6ff0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
7000: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
7010: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
7020: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
7030: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
7040: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
7050: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
7060: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7070: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
7080: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
7090: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
70a0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
70b0: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
70c0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
70d0: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
70e0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
70f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
7100: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
7110: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
7120: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
7130: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
7140: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
7150: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
7160: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
7170: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
7180: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
7190: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
71a0: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
71b0: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
71c0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
71d0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
71e0: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
71f0: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
7200: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
7210: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
7220: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
7230: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
7240: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
7250: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
7260: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7270: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
7280: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
7290: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
72a0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
72b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
72c0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
72d0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
72e0: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
72f0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
7300: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
7310: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
7320: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
7330: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
7340: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
7350: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
7360: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7370: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
7380: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
7390: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
73a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
73b0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
73c0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
73d0: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
73e0: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
73f0: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
7400: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
7410: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
7420: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76  dbeEnter()..*/.v
7430: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
7440: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
7450: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
7460: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
7470: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
7480: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
7490: 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d  f( p->lockMask==
74a0: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
74b0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
74c0: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
74d0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
74e0: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
74f0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  b;.  for(i=0, ma
7500: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
7510: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
7520: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
7530: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b   (mask & p->lock
7540: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
7550: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
7560: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7570: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
7580: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
7590: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
75a0: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
75b0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
75c0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
75d0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
75e0: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
75f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7600: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
7610: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
7620: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
7630: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
7640: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
7650: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
7660: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
7670: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7680: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
7690: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
76a0: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
76b0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
76c0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
76d0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
76e0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
76f0: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
7700: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
7710: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
7720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
7730: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
7740: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
7750: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
7760: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
7770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7780: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
7790: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
77a0: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
77b0: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
77c0: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
77d0: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
77e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
77f0: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
7800: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
7810: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
7820: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
7830: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
7840: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
7850: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
7860: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7870: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
7880: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
7890: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
78a0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
78b0: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
78c0: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
78d0: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
78e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
78f0: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7910: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7920: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
7930: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
7940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
7950: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
7960: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7970: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7980: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7990: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
79a0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
79b0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
79c0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
79d0: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
79e0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
79f0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
7a00: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
7a10: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
7a20: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
7a30: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
7a40: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
7a50: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7a60: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7a70: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7a80: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7a90: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7aa0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7ab0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7ac0: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7ad0: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7ae0: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
7af0: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
7b00: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
7b10: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
7b20: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
7b30: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
7b40: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
7b50: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7b60: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7b70: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7b80: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7b90: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7ba0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7bb0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7bc0: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7bd0: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7be0: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
7bf0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
7c00: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
7c10: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
7c20: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
7c30: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
7c40: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7c50: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7c60: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7c70: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7c80: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7c90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7ca0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7cb0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7cc0: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7cd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7ce0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7cf0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
7d00: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
7d10: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
7d20: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
7d30: 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  }.    db->malloc
7d40: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
7d50: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
7d60: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
7d70: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
7d80: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
7d90: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7da0: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
7db0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
7dc0: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
7dd0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
7de0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7df0: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
7e00: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
7e10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
7e20: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
7e30: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
7e40: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
7e50: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
7e60: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
7e70: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
7e80: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
7e90: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
7ea0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
7eb0: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
7ec0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
7ed0: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
7ee0: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
7ef0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
7f00: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
7f10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7f20: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
7f30: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
7f40: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
7f50: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
7f60: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
7f70: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
7f80: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
7f90: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
7fa0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
7fb0: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
7fc0: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
7fd0: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
7fe0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
7ff0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
8000: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
8010: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
8020: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
8030: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
8040: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
8050: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
8060: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
8070: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
8080: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
8090: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
80a0: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
80b0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
80c0: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
80d0: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
80e0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
80f0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
8100: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
8110: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
8120: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
8130: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
8140: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
8150: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
8160: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
8170: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
8180: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
8190: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
81c0: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
81f0: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
8200: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
8210: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8240: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
8250: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
8260: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
8270: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
8280: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
8290: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
82a0: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
82d0: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
82e0: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
82f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
8300: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
8310: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
8320: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
8330: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
8360: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
8370: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
83a0: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
83b0: 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74   = p->pResultSet
83c0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
83d0: 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66   /* First Mem of
83e0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
83f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
8400: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
8410: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
8420: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
8430: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
8440: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
8450: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
8460: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
8470: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
8480: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
8490: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
84a0: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
84b0: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
84c0: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
84d0: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
84e0: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
84f0: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
8500: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
8510: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
8520: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
8530: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
8540: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
8550: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
8560: 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  , 8);..  if( p->
8570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
8580: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
8590: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
85a0: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
85b0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
85c0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
85d0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
85e0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
85f0: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
8600: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8610: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
8620: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8630: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
8640: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
8650: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
8660: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
8670: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
8680: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
8690: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
86a0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
86b0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
86c0: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
86d0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
86e0: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
86f0: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
8700: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
8710: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
8720: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
8730: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
8740: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
8750: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
8760: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
8770: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
8780: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
8790: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
87a0: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
87b0: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
87c0: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
87d0: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
87e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
87f0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
8800: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
8810: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
8820: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
8830: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
8840: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
8850: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
8860: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
8870: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
8880: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
8890: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
88a0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
88b0: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
88c0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
88d0: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
88e0: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
88f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
8900: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
8910: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
8920: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
8930: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
8940: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
8950: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
8960: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
8970: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
8980: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
8990: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
89a0: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
89b0: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
89c0: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
89d0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
89e0: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
89f0: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
8a00: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
8a10: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
8a20: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
8a30: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
8a40: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
8a50: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
8a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
8a70: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
8a80: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
8a90: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
8aa0: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
8ab0: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
8ac0: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
8ad0: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
8ae0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
8af0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8b00: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
8b10: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
8b20: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
8b30: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
8b40: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
8b50: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
8b60: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
8b70: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
8b80: 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
8b90: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
8ba0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8bb0: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20  char *z;.    Op 
8bc0: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
8bd0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
8be0: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
8bf0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
8c00: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
8c10: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
8c20: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
8c30: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
8c40: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
8c50: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
8c60: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
8c70: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
8c80: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
8c90: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
8ca0: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
8cb0: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
8cc0: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
8cd0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
8ce0: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
8cf0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
8d00: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
8d10: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
8d20: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
8d30: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
8d40: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
8d50: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
8d60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
8d70: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
8d80: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8d90: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
8da0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
8db0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
8dc0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
8dd0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8df0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
8e00: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  nter */.      pM
8e10: 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70  em++;.  .      p
8e20: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8e30: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
8e40: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
8e50: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
8e60: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
8e70: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
8e80: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
8e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
8ea0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
8eb0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
8ec0: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
8ed0: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
8ee0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
8ef0: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
8f00: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
8f10: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
8f20: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
8f30: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
8f40: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
8f50: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
8f60: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
8f70: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
8f80: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
8f90: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
8fa0: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
8fb0: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
8fc0: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
8fd0: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
8fe0: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
8ff0: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
9000: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
9010: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
9020: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
9030: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9040: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
9050: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
9060: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
9070: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
9080: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
9090: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
90a0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
90b0: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
90c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
90d0: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
90e0: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
90f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9100: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
9110: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
9120: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
9130: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
9140: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
9150: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
9160: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
9170: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
9180: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
9190: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
91a0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
91b0: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
91c0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
91d0: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
91e0: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
91f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9200: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
9210: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
9220: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
9230: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
9260: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9270: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
9280: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
9290: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
92a0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
92b0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
92e0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
92f0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
9300: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
9310: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9320: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
9330: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
9340: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
9350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9360: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  3 */.    pMem->t
9370: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
9380: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
9390: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
93a0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
93b0: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20  em, 32, 0) ){   
93c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
93d0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
93e0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
93f0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
9400: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
9410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
9420: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
9430: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
9440: 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70  rm;.    z = disp
9450: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
9460: 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28  >z, 32);.    if(
9470: 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20   z!=pMem->z ){. 
9480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9490: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
94a0: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  z, -1, SQLITE_UT
94b0: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
94c0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
94d0: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
94e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
94f0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9500: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
9510: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
9520: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
9530: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9540: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9550: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
9560: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9570: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9580: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
9590: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20  Mem, 4, 0) ){.  
95a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
95b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
95c0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
95d0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
95e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
95f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9600: 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45  M_Dyn|MEM_Str|ME
9610: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
9620: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20  em->n = 2;.     
9630: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9640: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
9650: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
9660: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
9670: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9680: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
9690: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
96a0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
96b0: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65  pMem++;.  .#ifde
96c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
96d0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43       if( pOp->zC
96e0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
96f0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9700: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9710: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
9720: 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  z = pOp->zCommen
9730: 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  t;.        pMem-
9740: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
9750: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
9760: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
9770: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
9780: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
9790: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
97a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
97b0: 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
97c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
97d0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
9800: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
9810: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ype = SQLITE_NUL
9820: 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  L;.      }.    }
9830: 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  ..    p->nResCol
9840: 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e  umn = 8 - 4*(p->
9850: 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20  explain-1);.    
9860: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
9870: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
9880: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
9890: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
98a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
98b0: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
98c0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
98d0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
98e0: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
98f0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
9900: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
9910: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9920: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
9930: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
9940: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
9950: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
9960: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
9970: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
9980: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
9990: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
99a0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
99b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
99c0: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  *z = pOp->p4.z;.
99d0: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
99e0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
99f0: 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  z++;.    printf(
9a00: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
9a10: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
9a20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9a30: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
9a40: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9a50: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
9a60: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
9a70: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
9a80: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
9a90: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
9aa0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
9ab0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
9ac0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
9ad0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
9ae0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
9af0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
9b00: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
9b10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
9b20: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
9b30: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
9b40: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
9b50: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
9b60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
9b70: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
9b80: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9b90: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
9ba0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
9bb0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
9bc0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
9bd0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
9be0: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
9bf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9c00: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
9c10: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
9c20: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
9c30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
9c40: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
9c50: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9c60: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
9c70: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
9c80: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
9c90: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
9ca0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
9cb0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
9cc0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9cd0: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
9ce0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
9cf0: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  CE */../*.** All
9d00: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d  ocate space from
9d10: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75   a fixed size bu
9d20: 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ffer and return 
9d30: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
9d40: 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20  that space.  If 
9d50: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
9d60: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ce is available,
9d70: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
9d80: 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72  .** The pBuf par
9d90: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e  ameter is the in
9da0: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61  itial value of a
9db0: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77   pointer which w
9dc0: 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74  ill.** receive t
9dd0: 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  he new memory.  
9de0: 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  pBuf is normally
9df0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20   NULL.  If pBuf 
9e00: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20  is not.** NULL, 
9e10: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65  it means that me
9e20: 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61  mory space has a
9e30: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
9e40: 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a  cated and that.*
9e50: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
9e60: 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61  hould not alloca
9e70: 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72  te any new memor
9e80: 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73  y.  When pBuf is
9e90: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d   not.** NULL sim
9ea0: 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e  ply return pBuf.
9eb0: 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20    Only allocate 
9ec0: 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  new memory space
9ed0: 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73   when pBuf.** is
9ee0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   NULL..**.** nBy
9ef0: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
9f00: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
9f10: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
9f20: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20   *ppFrom points 
9f30: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  to available spa
9f40: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e  ce and pEnd poin
9f50: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ts to the end of
9f60: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   the.** availabl
9f70: 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73  e space.  When s
9f80: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
9f90: 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64  d, *ppFrom is ad
9fa0: 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74  vanced past.** t
9fb0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c  he end of the al
9fc0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a  located space..*
9fd0: 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20  *.** *pnByte is 
9fe0: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  a counter of the
9ff0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a000: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68   of space that h
a010: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  ave failed.** to
a020: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74   allocate.  If t
a030: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63  here is insuffic
a040: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70  ient space in *p
a050: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79  pFrom to satisfy
a060: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c   the.** request,
a070: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
a080: 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61  *pnByte by the a
a090: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71  mount of the req
a0a0: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uest..*/.static 
a0b0: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
a0c0: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  (.  void *pBuf, 
a0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
a0e0: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  e return pointer
a0f0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
a100: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
a110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a120: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
a130: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38  allocate */.  u8
a140: 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20   **ppFrom,      
a150: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c     /* IN/OUT: Al
a160: 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46  locate from *ppF
a170: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  rom */.  u8 *pEn
a180: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
a190: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
a1a0: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
a1b0: 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65  of *ppFrom buffe
a1c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79  r */.  int *pnBy
a1d0: 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  te          /* I
a1e0: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  f allocation can
a1f0: 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63  not be made, inc
a200: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a  rement *pnByte *
a210: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
a220: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
a230: 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a  ENT(*ppFrom) );.
a240: 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74    if( pBuf ) ret
a250: 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74  urn pBuf;.  nByt
a260: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
a270: 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72  );.  if( &(*ppFr
a280: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45  om)[nByte] <= pE
a290: 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d  nd ){.    pBuf =
a2a0: 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b   (void*)*ppFrom;
a2b0: 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20  .    *ppFrom += 
a2c0: 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nByte;.  }else{.
a2d0: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e      *pnByte += n
a2e0: 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
a2f0: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
a300: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
a310: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
a320: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
a330: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
a340: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
a350: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
a360: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
a370: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a380: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
a390: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
a3a0: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
a3b0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
a3c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
a3d0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
a3e0: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
a3f0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
a400: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
a410: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
a420: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
a430: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
a440: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
a450: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
a460: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
a470: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
a480: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
a490: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a4a0: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20  EBUG.  for(i=1; 
a4b0: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
a4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a4d0: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
a4e0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
a4f0: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
a500: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a510: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
a520: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
a530: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
a540: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
a550: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
a560: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
a570: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
a580: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
a590: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
a5a0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
a5b0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
a5c0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
a5d0: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
a5e0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
a5f0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
a600: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
a610: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
a620: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
a630: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
a640: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
a650: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
a660: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
a670: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
a680: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a690: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
a6a0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
a6b0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
a6c0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
a6d0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
a6e0: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
a6f0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
a700: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
a710: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
a720: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
a730: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
a740: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
a750: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
a760: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
a770: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f  e called exact o
a780: 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69  nce on a each vi
a790: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
a7a0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
a7b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
a7c0: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
a7d0: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
a7e0: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
a7f0: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
a800: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
a810: 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f   futher calls to
a820: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
a830: 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
a840: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
a850: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a860: 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
a870: 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
a880: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
a890: 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
a8a0: 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
a8b0: 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
a8c0: 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
a8d0: 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
a8e0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
a8f0: 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
a900: 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
a910: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
a920: 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
a930: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
a940: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
a950: 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
a960: 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
a970: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
a980: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
a990: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
a9a0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
a9d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
aa00: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
aa10: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
aa30: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
aa40: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
aa50: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
aa60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
aa70: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
aa80: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
aa90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aaa0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
aab0: 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
aac0: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
aad0: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
aaf0: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
ab00: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
ab10: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ab30: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
ab40: 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
ab50: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ams */.  int n; 
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ab80: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
ab90: 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *zCsr;          
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
abb0: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
abc0: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
abd0: 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20  /.  u8 *zEnd;   
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
ac00: 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20   past allocated 
ac10: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
ac20: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
ac30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
ac40: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d  w much extra mem
ac50: 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ory is needed */
ac60: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
ac70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ac80: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
ac90: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
aca0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
acb0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
acc0: 49 4e 49 54 20 29 3b 0a 20 20 64 62 20 3d 20 70  INIT );.  db = p
acd0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
ace0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
acf0: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
ad00: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
ad10: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
ad20: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
ad30: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
ad40: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
ad50: 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a  nMaxArg;.  .  /*
ad60: 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   For each cursor
ad70: 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20   required, also 
ad80: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72  allocate a memor
ad90: 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20  y cell. Memory. 
ada0: 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b   ** cells (nMem+
adb0: 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d  1-nCursor)..nMem
adc0: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c  , inclusive, wil
add0: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  l never be used 
ade0: 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65  by.  ** the vdbe
adf0: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61   program. Instea
ae00: 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  d they are used 
ae10: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
ae20: 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43  e for.  ** VdbeC
ae30: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
ae40: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
ae50: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
ae60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
ae70: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
ae80: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
ae90: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
aea0: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
aeb0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
aec0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
aed0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
aee0: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
aef0: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
af00: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
af10: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
af20: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
af30: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
af40: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67  e for memory reg
af50: 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69  isters, SQL vari
af60: 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73  ables, VDBE curs
af70: 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e  ors and .  ** an
af80: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61   array to marsha
af90: 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  l SQL function a
afa0: 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a  rguments in..  *
afb0: 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29  /.  zCsr = (u8*)
afc0: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
afd0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
afe0: 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61   avaliable for a
aff0: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a  llocation */.  z
b000: 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  End = (u8*)&p->a
b010: 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b  Op[p->nOpAlloc];
b020: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
b030: 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72  past end of zCsr
b040: 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65  [] */..  resolve
b050: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
b060: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
b070: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
b080: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
b090: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
b0a0: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
b0b0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
b0c0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
b0d0: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
b0e0: 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c  }.  memset(zCsr,
b0f0: 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a   0, zEnd-zCsr);.
b100: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
b110: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61  - (u8*)0)&7;.  a
b120: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
b130: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
b140: 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  ) );..  /* Memor
b150: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
b160: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
b170: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
b180: 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20  ocated in two.  
b190: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
b1a0: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
b1b0: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
b1c0: 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74  nused space at t
b1d0: 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20  he .  ** end of 
b1e0: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
b1f0: 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  .  If we are una
b200: 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61  ble to satisfy a
b210: 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72  ll memory.  ** r
b220: 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72  equirements by r
b230: 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64  eusing the opcod
b240: 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68  e array tail, th
b250: 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  en the second.  
b260: 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c  ** pass will fil
b270: 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73  l in the rest us
b280: 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f  ing a fresh allo
b290: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
b2a0: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
b2b0: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
b2c0: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
b2d0: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
b2e0: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
b2f0: 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61  leftover space a
b300: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
b310: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61   opcode array ca
b320: 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
b330: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
b340: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
b350: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
b360: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
b370: 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e   */.  do {.    n
b380: 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  Byte = 0;.    p-
b390: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
b3a0: 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ce(p->aMem, nMem
b3b0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
b3c0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
b3d0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20  e);.    p->aVar 
b3e0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
b3f0: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
b400: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
b410: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b420: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
b430: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
b440: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
b450: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
b460: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b470: 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53  ->azVar = allocS
b480: 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e  pace(p->azVar, n
b490: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
b4a0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b4b0: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b4c0: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
b4d0: 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  ce(p->apCsr, nCu
b4e0: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
b4f0: 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20  Cursor*),.      
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c      &zCsr, zEnd,
b520: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66   &nByte);.    if
b530: 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
b540: 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69   p->pFree = sqli
b550: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
b560: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
b570: 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e  }.    zCsr = p->
b580: 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20  pFree;.    zEnd 
b590: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
b5a0: 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20    }while( nByte 
b5b0: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
b5c0: 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43  iled );..  p->nC
b5d0: 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75  ursor = (u16)nCu
b5e0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 2d 3e 61  rsor;.  if( p->a
b5f0: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
b600: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
b610: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
b620: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
b630: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
b640: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
b650: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b660: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
b670: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
b680: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56  ar ){.    p->nzV
b690: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56  ar = pParse->nzV
b6a0: 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ar;.    memcpy(p
b6b0: 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d  ->azVar, pParse-
b6c0: 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72  >azVar, p->nzVar
b6d0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72  *sizeof(p->azVar
b6e0: 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  [0]));.    memse
b6f0: 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  t(pParse->azVar,
b700: 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61   0, pParse->nzVa
b710: 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  r*sizeof(pParse-
b720: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d  >azVar[0]));.  }
b730: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
b740: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b  {.    p->aMem--;
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
b770: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
b780: 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  m */.    p->nMem
b790: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
b7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
b7b0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
b7c0: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28  em-1 */.    for(
b7d0: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
b7e0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  +){.      p->aMe
b7f0: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
b800: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
b810: 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aMem[n].db = db;
b820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
b830: 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65  explain = pParse
b840: 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c  ->explain;.  sql
b850: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70  ite3VdbeRewind(p
b860: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
b870: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
b880: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
b890: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
b8a0: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
b8b0: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
b8c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b8d0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
b8e0: 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72  e *p, VdbeCursor
b8f0: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
b900: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
b910: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
b920: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71  x->pBt ){.    sq
b930: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
b940: 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f  pCx->pBt);.    /
b950: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
b960: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
b970: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
b980: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
b990: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  .    ** the call
b9a0: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c   above. */.  }el
b9b0: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  se if( pCx->pCur
b9c0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
b9d0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
b9e0: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
b9f0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
ba00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ba10: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
ba20: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
ba30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
ba40: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
ba50: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
ba60: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
ba70: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
ba80: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
ba90: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
baa0: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
bab0: 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  = 1;.    pModule
bac0: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
bad0: 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  rsor);.    p->in
bae0: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
baf0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
bb00: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
bb10: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
bb20: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
bb30: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
bb40: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
bb50: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
bb60: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
bb70: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
bb80: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
bb90: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
bba0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
bbb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
bbc0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
bbd0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
bbe0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
bbf0: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e  pFrame->v;.  v->
bc00: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
bc10: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
bc20: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
bc30: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
bc40: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
bc50: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
bc60: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
bc70: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
bc80: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
bc90: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
bca0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
bcb0: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
bcc0: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
bcd0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
bce0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  e;.  return pFra
bcf0: 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
bd00: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
bd10: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
bd20: 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
bd30: 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
bd40: 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
bd50: 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
bd60: 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
bd70: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
bd80: 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
bd90: 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
bda0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
bdb0: 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
bdc0: 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
bdd0: 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
bde0: 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
bdf0: 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
be00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
be10: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
be20: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
be30: 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
be40: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
be50: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
be60: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
be70: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
be80: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
be90: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
bea0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
beb0: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
bec0: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
bed0: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
bee0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
bef0: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
bf00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bf10: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
bf20: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
bf30: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
bf40: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
bf50: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
bf60: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
bf70: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
bf80: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
bf90: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
bfa0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
bfb0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
bfc0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
bfd0: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
bfe0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
bff0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
c000: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
c010: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
c020: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
c030: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
c040: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
c050: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
c060: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDel);.  }.}../
c070: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
c080: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
c090: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
c0a0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
c0b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
c0c0: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
c0d0: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
c0e0: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
c0f0: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
c100: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
c110: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
c120: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
c130: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
c140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
c150: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
c160: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c170: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
c180: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
c190: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
c1a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
c1b0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
c1c0: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
c1d0: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
c1e0: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
c1f0: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
c200: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
c210: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
c220: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
c230: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
c240: 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73  sr==0 || p->apCs
c250: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  r[i]==0 );.  for
c260: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
c270: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
c280: 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e  ->aMem==0 || p->
c290: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
c2a0: 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69  EM_Null );.#endi
c2b0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
c2c0: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
c2d0: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
c2e0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
c2f0: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
c300: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
c310: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
c320: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
c330: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
c340: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
c350: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
c360: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
c370: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
c380: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
c390: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
c3a0: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
c3b0: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
c3c0: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
c3d0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
c3e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
c3f0: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
c400: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
c410: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
c420: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
c430: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
c440: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
c450: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c460: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
c470: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c480: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
c490: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
c4a0: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
c4b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
c4c0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
c4d0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c4e0: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
c4f0: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
c500: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
c510: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
c520: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
c530: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
c540: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
c550: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
c560: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
c570: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
c580: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
c590: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
c5a0: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
c5b0: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
c5c0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
c5d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
c5e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c5f0: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
c600: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
c610: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
c620: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
c630: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
c640: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
c650: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
c660: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
c670: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
c680: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
c690: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
c6a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
c6b0: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
c6c0: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
c6d0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
c6e0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
c6f0: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
c700: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
c710: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
c720: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
c730: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
c740: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
c750: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
c760: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
c770: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
c780: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
c790: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
c7a0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
c7d0: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
c7e0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
c810: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
c820: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
c830: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c850: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
c860: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
c870: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
c880: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
c890: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
c8a0: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
c8b0: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
c8c0: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
c8d0: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
c8e0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
c8f0: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
c900: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
c910: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
c920: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
c930: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
c940: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
c950: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
c960: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
c970: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
c990: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
c9a0: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
c9b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c9c0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
c9d0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
c9e0: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
c9f0: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
ca00: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
ca10: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
ca20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
ca30: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
ca40: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
ca50: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
ca60: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
ca70: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
ca80: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
ca90: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
caa0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cab0: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
cac0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
cad0: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
cae0: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
caf0: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
cb00: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
cb10: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
cb20: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
cb30: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
cb40: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
cb50: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
cb60: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
cb70: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
cb80: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
cb90: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cba0: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
cbb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
cbc0: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
cbd0: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
cbe0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
cbf0: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
cc00: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
cc10: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
cc20: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
cc30: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
cc40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
cc50: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
cc60: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
cc70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
cc80: 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
cc90: 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
cca0: 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
ccb0: 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
ccc0: 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
ccd0: 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
cce0: 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
ccf0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
cd00: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
cd10: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
cd20: 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
cd30: 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
cd40: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
cd50: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
cd60: 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
cd70: 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
cd80: 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
cd90: 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
cda0: 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
cdb0: 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
cdc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cdd0: 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
cde0: 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
cdf0: 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
ce00: 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
ce10: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
ce20: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
ce30: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
ce40: 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
ce50: 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a   &p->zErrMsg);..
ce60: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
ce70: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
ce80: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
ce90: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
cea0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
ceb0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
cec0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
ced0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
cee0: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
cef0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
cf00: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
cf10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
cf20: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
cf30: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
cf40: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
cf50: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
cf60: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
cf70: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
cf80: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
cf90: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
cfa0: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
cfb0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
cfc0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
cfd0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
cfe0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
cff0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d000: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
d010: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
d020: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
d030: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
d040: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
d050: 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ++;.      rc = s
d060: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
d070: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
d080: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
d090: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d0a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d0b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
d0c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d0d0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
d0e0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
d0f0: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
d100: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
d110: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
d120: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
d130: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
d140: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
d150: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
d160: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
d170: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d180: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d190: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
d1a0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
d1b0: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
d1c0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
d1d0: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
d1e0: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
d1f0: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
d200: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
d210: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
d220: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
d230: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
d240: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
d250: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
d260: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
d270: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
d280: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
d290: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
d2a0: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
d2b0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
d2c0: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
d2d0: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
d2e0: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
d2f0: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
d300: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
d310: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
d320: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
d330: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
d340: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
d350: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
d360: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
d370: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
d380: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
d390: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
d3a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
d3b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d3c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
d3d0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
d3e0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
d3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
d400: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
d410: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
d420: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
d430: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d440: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
d450: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
d460: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
d470: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
d480: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
d490: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
d4a0: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
d4b0: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
d4c0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
d4d0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
d4e0: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
d4f0: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
d500: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
d510: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
d520: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
d530: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
d540: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
d550: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d560: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
d570: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
d580: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d590: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d5a0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d5b0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d5c0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d5d0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d5e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d5f0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d600: 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
d610: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d620: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d630: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
d640: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
d650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d660: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
d670: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
d680: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
d690: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
d6a0: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
d6b0: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
d6c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d6d0: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
d6e0: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
d6f0: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
d700: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
d710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
d720: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
d730: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
d740: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
d750: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
d760: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
d770: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
d780: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
d790: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d7a0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
d7b0: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
d7c0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
d7d0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
d7e0: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
d7f0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
d800: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
d810: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
d820: 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a  int res;..    /*
d830: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
d840: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d850: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
d860: 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
d870: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
d880: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
d890: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
d8a0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
d8b0: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
d8c0: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a  Random);.      z
d8d0: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
d8e0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
d8f0: 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69  mj%08X", zMainFi
d900: 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66  le, iRandom&0x7f
d910: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
d920: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
d930: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d940: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d950: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d960: 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61  3FileSuffix3(zMa
d970: 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29  inFile, zMaster)
d980: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d990: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
d9a0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
d9b0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
d9c0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
d9d0: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
d9e0: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
d9f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
da00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
da10: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
da20: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
da30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
da40: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
da50: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
da60: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
da70: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
da80: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
da90: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
daa0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
dab0: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
dac0: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
dad0: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
dae0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
daf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
db00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
db10: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
db20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
db30: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
db40: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
db50: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
db60: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
db70: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
db80: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
db90: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
dba0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
dbb0: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
dbc0: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
dbd0: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
dbe0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
dbf0: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
dc00: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
dc10: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
dc20: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
dc30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
dc40: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
dc50: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
dc60: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
dc70: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
dc80: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
dc90: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
dca0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
dcb0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
dcc0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
dcd0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
dce0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
dcf0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
dd00: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
dd10: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
dd20: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
dd30: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
dd40: 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
dd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
dd60: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
dd70: 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72   TEMP and :memor
dd80: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
dd90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dda0: 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b    assert( zFile[
ddb0: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]!=0 );.       
ddc0: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
ddd0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
dde0: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
ddf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
de00: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
de10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
de20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
de30: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
de40: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
de50: 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
de60: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
de70: 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
de80: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
de90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
dea0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
deb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
dec0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
ded0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
dee0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
def0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
df00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
df10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
df20: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
df30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
df40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
df50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
df60: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
df70: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
df80: 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
df90: 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
dfa0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
dfb0: 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
dfc0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
dfd0: 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  ( needSync .    
dfe0: 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f   && 0==(sqlite3O
dff0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e000: 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
e010: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
e020: 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
e030: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
e040: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
e050: 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
e060: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
e070: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
e080: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
e090: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
e0a0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
e0b0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
e0c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e0d0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
e0e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e0f0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
e100: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
e110: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
e120: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
e130: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
e140: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
e150: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e160: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
e170: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
e180: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
e190: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
e1a0: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
e1b0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
e1c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
e1d0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
e1e0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
e1f0: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
e200: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
e210: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
e220: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
e230: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
e240: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
e250: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
e260: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
e270: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
e280: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
e290: 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
e2a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
e2b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
e2c0: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
e2d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
e2e0: 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
e2f0: 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
e300: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
e310: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
e320: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
e330: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
e340: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e350: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e360: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
e370: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e380: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e390: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
e3a0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
e3b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e3c0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
e3d0: 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
e3e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
e3f0: 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
e400: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e410: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e420: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
e430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e440: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e450: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
e460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
e470: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
e480: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
e490: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
e4a0: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
e4b0: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
e4c0: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
e4d0: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
e4e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
e4f0: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
e500: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
e510: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
e520: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
e530: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e540: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
e550: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
e560: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
e570: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e580: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e590: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
e5a0: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
e5b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
e5c0: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
e5d0: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
e5e0: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
e5f0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
e600: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
e610: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
e620: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
e630: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
e640: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
e650: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
e660: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
e670: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
e680: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
e690: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
e6a0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
e6b0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
e6c0: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
e6d0: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
e6e0: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
e6f0: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
e700: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
e710: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
e720: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
e730: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
e740: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
e750: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
e760: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
e770: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
e780: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
e790: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
e7a0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
e7b0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
e7c0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
e7d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
e7e0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e7f0: 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b  haseTwo(pBt, 1);
e800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e810: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
e820: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
e830: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
e840: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
e850: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
e860: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
e870: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
e880: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
e890: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
e8a0: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
e8b0: 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74  e3.activeVdbeCnt
e8c0: 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
e8d0: 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
e8e0: 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
e8f0: 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
e900: 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
e910: 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
e920: 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
e930: 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
e940: 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
e950: 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
e960: 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
e970: 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
e980: 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
e990: 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
e9a0: 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
e9b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
e9c0: 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
e9d0: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
e9e0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
e9f0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
ea00: 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
ea10: 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
ea20: 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
ea30: 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
ea40: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
ea50: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
ea60: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
ea70: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
ea80: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
ea90: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
eaa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
eab0: 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
eac0: 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ite++;.    }.   
ead0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
eae0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
eaf0: 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ==db->activeVdbe
eb00: 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Cnt );.  assert(
eb10: 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69   nWrite==db->wri
eb20: 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  teVdbeCnt );.}.#
eb30: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
eb40: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
eb50: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
eb60: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
eb70: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
eb80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
eb90: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
eba0: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
ebb0: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
ebc0: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
ebd0: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
ebe0: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
ebf0: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
ec00: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
ec10: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
ec20: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
ec30: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
ec40: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
ec50: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
ec60: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
ec70: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
ec80: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
ec90: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
eca0: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
ecb0: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
ecc0: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
ecd0: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
ece0: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
ecf0: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
ed00: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
ed10: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
ed20: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
ed30: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
ed40: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
ed50: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
ed60: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
ed70: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
ed80: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
ed90: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
eda0: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
edb0: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
edc0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
edd0: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
ede0: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
edf0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
ee00: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
ee10: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73  used again..*/.s
ee20: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
ee30: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
ee40: 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c  difiedBtrees(sql
ee50: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
ee60: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ee70: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
ee80: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
ee90: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
eea0: 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69     if( p && sqli
eeb0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
eec0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(p) ){.      sq
eed0: 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
eee0: 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49  lCursors(p, SQLI
eef0: 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d  TE_ABORT);.    }
ef00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
ef10: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
ef20: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
ef30: 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
ef40: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
ef50: 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
ef60: 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
ef70: 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
ef80: 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
ef90: 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
efa0: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
efb0: 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
efc0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
efd0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
efe0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
eff0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
f000: 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
f010: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
f020: 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
f030: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
f040: 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a  s commtted..**.*
f050: 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
f060: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
f070: 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
f080: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
f090: 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
f0a0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
f0b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f0c0: 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
f0d0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
f0e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
f0f0: 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
f100: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f110: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
f120: 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
f130: 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
f140: 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
f150: 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
f160: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f170: 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
f180: 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
f190: 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
f1a0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
f1b0: 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
f1c0: 79 20 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20  y have occured, 
f1d0: 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67  causing an emerg
f1e0: 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ency rollback.. 
f1f0: 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
f200: 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74   (db->nStatement
f210: 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20  ==0), and there 
f220: 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  is nothing to do
f230: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
f240: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
f250: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
f260: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
f270: 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
f280: 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
f290: 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65  ent-1;..    asse
f2a0: 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
f2b0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
f2c0: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
f2d0: 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65  LEASE);.    asse
f2e0: 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
f2f0: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  nt>0 );.    asse
f300: 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
f310: 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  t==(db->nStateme
f320: 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
f330: 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  t) );..    for(i
f340: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
f350: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
f360: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
f370: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
f380: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
f390: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
f3a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
f3b0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
f3c0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
f3d0: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
f3e0: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
f3f0: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
f400: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
f410: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
f420: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
f430: 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2==SQLITE_OK ){.
f440: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
f450: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
f460: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
f470: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
f480: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
f490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
f4a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f4b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
f4c0: 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc2;.        }.
f4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f4e0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
f4f0: 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74  --;.    p->iStat
f500: 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ement = 0;..    
f510: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f520: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  K ){.      if( e
f530: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
f540: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
f550: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
f560: 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
f570: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f580: 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
f590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f5a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f5c0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
f5d0: 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
f5e0: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
f5f0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f600: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f610: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
f620: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f630: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
f640: 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
f650: 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
f660: 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
f670: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
f680: 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
f690: 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
f6a0: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  n .    ** the st
f6b0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f6c0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
f6d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   */.    if( eOp=
f6e0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
f6f0: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ACK ){.      db-
f700: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
f710: 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
f720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f730: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f740: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f750: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
f760: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
f770: 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
f780: 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
f790: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
f7a0: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
f7b0: 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
f7c0: 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
f7d0: 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
f7e0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
f7f0: 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
f800: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
f810: 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
f820: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f830: 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
f840: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
f850: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
f860: 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
f870: 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
f880: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
f890: 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
f8a0: 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
f8b0: 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
f8c0: 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
f8d0: 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a  INT and write.**
f8e0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
f8f0: 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
f900: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
f910: 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
f920: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f930: 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
f940: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
f950: 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
f960: 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
f970: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
f980: 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 64  ( (deferred && d
f990: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
f9a0: 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72 65  >0) || (!deferre
f9b0: 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
f9c0: 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20  raint>0) ){.    
f9d0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
f9e0: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 70  ONSTRAINT;.    p
f9f0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
fa00: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
fa10: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
fa20: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
fa30: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  "foreign key con
fa40: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29  straint failed")
fa50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fa60: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
fa70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fa80: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
fa90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
faa0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
fab0: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
fac0: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
fad0: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
fae0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
faf0: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
fb00: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
fb10: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
fb20: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
fb30: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
fb40: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
fb50: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
fb60: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
fb70: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
fb80: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
fb90: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
fba0: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
fbb0: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
fbc0: 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
fbd0: 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
fbe0: 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
fbf0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
fc00: 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
fc10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
fc20: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
fc30: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
fc40: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
fc50: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
fc60: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
fc70: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
fc80: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
fc90: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
fca0: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
fcb0: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
fcc0: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
fcd0: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
fce0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
fcf0: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  lt(Vdbe *p){.  i
fd00: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd20: 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * Used to store 
fd30: 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e  transient return
fd40: 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   codes */.  sqli
fd50: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
fd60: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
fd70: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
fd80: 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
fd90: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
fda0: 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
fdb0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
fdc0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
fdd0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
fde0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
fdf0: 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
fe00: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
fe10: 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
fe20: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
fe30: 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
fe40: 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
fe50: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
fe60: 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
fe70: 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
fe80: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
fe90: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
fea0: 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
feb0: 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
fec0: 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
fed0: 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
fee0: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
fef0: 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
ff00: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
ff10: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
ff20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
ff30: 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
ff40: 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
ff50: 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
ff60: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
ff70: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
ff80: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
ff90: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
ffa0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
ffb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
ffc0: 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  M;.  }.  closeAl
ffd0: 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
ffe0: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
fff0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
10000 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10010 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
10020 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
10030 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
10040 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
10050 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
10060 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
10070 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
10080 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=0 ){.    int 
10090 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
100a0 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
100b0 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
100c0 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
100d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
100e0 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
100f0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
10100 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
10110 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
10120 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
10130 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
10140 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
10150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
10160 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
10170 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
10180 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
10190 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
101a0 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
101b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
101c0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
101d0 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54  BLOCKED );  /* T
101e0 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e  his error no lon
101f0 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ger exists */.  
10200 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
10210 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
10220 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
10230 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10250 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
10260 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
10270 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
10280 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
10290 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
102a0 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
102b0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
102c0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
102d0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
102e0 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
102f0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
10300 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
10310 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
10320 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
10330 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
10340 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
10350 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
10360 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
10370 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
10380 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
10390 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
103a0 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
103b0 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
103c0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
103d0 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
103e0 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
103f0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
10400 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
10410 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
10420 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 65  .      ** occure
10430 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
10440 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
10450 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
10460 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
10470 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
10480 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
10490 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
104a0 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
104b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
104c0 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
104d0 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
104e0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
104f0 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
10500 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
10510 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
10520 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
10530 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
10540 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
10550 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
10560 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
10570 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
10580 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
10590 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
105a0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
105b0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
105c0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
105d0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
105e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
105f0 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
10600 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
10610 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
10620 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
10630 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
10640 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
10650 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
10660 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
10670 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
10680 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
10690 20 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69            invali
106a0 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
106b0 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b  ifiedBtrees(db);
106c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
106d0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
106e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
106f0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
10700 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
10710 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
10720 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
10730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10740 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
10750 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
10760 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
10770 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
10780 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
107a0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
107b0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
107c0 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
107d0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
107e0 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
107f0 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
10800 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
10810 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
10820 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
10830 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
10840 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
10850 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
10860 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
10870 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
10880 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
10890 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
108a0 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
108b0 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
108c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
108d0 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
108e0 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
108f0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
10900 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56     && db->writeV
10910 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64  dbeCnt==(p->read
10920 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
10930 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
10940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
10950 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
10960 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
10970 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
10980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10990 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
109a0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
109b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
109c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
109d0 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
109e0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
109f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
10a00 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
10a10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10a20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
10a30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
10a40 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
10a50 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d  RAINT;.        }
10a60 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
10a70 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
10a80 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
10a90 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
10aa0 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
10ab0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
10ac0 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
10ad0 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
10ae0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
10af0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
10b00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
10b10 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
10b20 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
10b30 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
10b40 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
10b50 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
10b60 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
10b70 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
10b80 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
10b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10ba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
10bb0 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
10bc0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
10bd0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
10be0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
10bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
10c00 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
10c10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10c20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10c30 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
10c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10c50 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
10c60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10c70 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
10c80 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
10c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
10ca0 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
10cb0 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
10cc0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
10cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10ce0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
10cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
10d00 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
10d10 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
10d20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
10d30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
10d40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
10d50 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
10d60 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
10d70 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
10d80 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
10d90 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
10da0 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
10db0 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
10dc0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
10dd0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
10de0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
10df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10e00 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
10e10 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
10e20 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
10e30 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10e40 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10e50 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
10e60 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
10e70 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
10e80 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
10e90 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
10ea0 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
10eb0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
10ec0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
10ed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
10ee0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
10ef0 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
10f00 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
10f10 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
10f20 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
10f30 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
10f40 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
10f50 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
10f60 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
10f70 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
10f80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
10f90 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
10fa0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
10fb0 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20  en promote the. 
10fc0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74     ** current st
10fd0 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f  atement error co
10fe0 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  de..    */.    i
10ff0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  f( eStatementOp 
11000 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
11010 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
11020 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74  atement(p, eStat
11030 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20  ementOp);.      
11040 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
11050 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11060 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
11070 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
11080 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
11090 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
110a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
110b0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
110c0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
110d0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
110e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
110f0 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
11100 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
11110 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
11120 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
11130 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
11140 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
11150 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
11160 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
11170 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
11180 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
11190 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
111a0 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
111b0 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
111c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
111d0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
111e0 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
111f0 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
11200 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11210 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
11220 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
11230 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
11240 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
11250 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
11260 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
11270 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11280 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
11290 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
112a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
112b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
112c0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
112d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
112e0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
112f0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
11300 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
11310 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
11320 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
11330 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
11340 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
11350 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
11360 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
11370 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
11380 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
11390 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b  lSchema(db, -1);
113a0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
113b0 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20   = (db->flags | 
113c0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
113d0 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nges);.    }..  
113e0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
113f0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
11400 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
11410 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
11420 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
11430 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
11440 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
11450 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
11460 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11470 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
11480 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  veVdbeCnt--;.   
11490 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
114a0 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77  y ){.      db->w
114b0 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  riteVdbeCnt--;. 
114c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
114d0 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
114e0 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  nt>=db->writeVdb
114f0 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  eCnt );.  }.  p-
11500 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
11510 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
11520 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
11530 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
11540 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11550 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
11560 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
11570 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
11580 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
11590 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
115a0 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
115b0 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
115c0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
115d0 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
115e0 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
115f0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
11600 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
11610 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
11620 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
11630 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
11640 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
11650 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
11660 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
11670 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
11680 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
11690 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
116a0 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
116b0 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
116c0 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
116d0 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
116e0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
116f0 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
11700 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
11710 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
11720 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
11730 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
11740 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
11750 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
11760 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
11770 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
11780 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
11790 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
117a0 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
117b0 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
117c0 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
117d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
117e0 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
117f0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
11800 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
11810 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
11820 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
11830 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
11840 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
11850 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
11860 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
11870 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
11880 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
11890 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
118a0 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
118b0 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
118c0 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
118d0 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
118e0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
118f0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
11900 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
11910 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
11920 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
11930 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
11940 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
11950 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
11960 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
11970 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
11980 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
11990 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
119a0 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
119b0 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
119c0 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
119d0 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
119e0 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
119f0 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
11a00 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
11a10 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
11a20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
11a30 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
11a40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11a50 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
11a60 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
11a70 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
11a80 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
11a90 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
11aa0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
11ab0 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
11ac0 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
11ad0 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
11ae0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
11af0 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
11b00 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
11b10 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
11b20 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
11b30 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
11b40 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
11b50 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
11b60 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
11b70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
11b80 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
11b90 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
11ba0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11bb0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
11bd0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
11be0 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
11bf0 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49  SQLITE_UTF8,SQLI
11c00 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11c10 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
11c20 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11c30 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65       db->errCode
11c40 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20   = p->rc;.      
11c50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11c60 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11c70 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
11c80 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
11c90 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
11ca0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11cb0 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
11cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
11cd0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
11ce0 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
11cf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
11d00 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
11d10 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
11d20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
11d30 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
11d40 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
11d50 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
11d60 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
11d70 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
11d80 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
11d90 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
11da0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
11db0 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
11dc0 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
11dd0 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
11de0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
11df0 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
11e00 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
11e10 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
11e20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
11e30 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
11e40 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
11e50 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
11e60 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
11e70 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
11e80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11e90 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11ea0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
11eb0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
11ec0 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
11ed0 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
11ee0 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
11ef0 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
11f00 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
11f10 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
11f20 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
11f30 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
11f40 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
11f50 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
11f60 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
11f70 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
11f80 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
11f90 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
11fa0 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
11fb0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11fc0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
11fd0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
11fe0 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
11ff0 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
12000 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
12010 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
12020 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12030 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
12040 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
12050 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
12060 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
12070 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
12080 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
12090 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
120a0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
120b0 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
120c0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
120d0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
120e0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
120f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
12100 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
12110 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
12120 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
12130 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
12140 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
12150 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
12160 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
12170 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
12180 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
12190 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
121a0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
121b0 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
121c0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
121d0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
121e0 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
121f0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
12200 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
12210 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
12220 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
12230 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
12240 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12250 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
12260 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
12270 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
12280 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
12290 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
122a0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
122b0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
122c0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
122d0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
122e0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
122f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
12310 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
12320 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
12330 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
12340 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
12350 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
12360 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
12370 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
12380 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
12390 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
123a0 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
123b0 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
123c0 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
123d0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
123e0 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
123f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
12400 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
12410 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
12420 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
12430 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
12440 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
12450 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
12460 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
12470 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
12480 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
12490 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
124a0 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c  (mask&(((u32)1)<
124b0 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
124c0 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
124d0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
124e0 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
124f0 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
12500 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
12510 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
12520 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
12530 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
12540 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
12550 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
12560 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
12570 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
12580 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
12590 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
125a0 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
125b0 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
125c0 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
125d0 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
125e0 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
125f0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
12600 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12610 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
12620 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
12630 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
12640 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 73 71 6c  DeleteObject(sql
12650 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
12660 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
12670 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
12680 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
12690 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
126a0 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
126b0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
126c0 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
126d0 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
126e0 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
126f0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
12700 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28  LNAME_N);.  for(
12710 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d  pSub=p->pProgram
12720 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65  ; pSub; pSub=pNe
12730 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
12740 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSub->pNext;.  
12750 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
12760 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c  y(db, pSub->aOp,
12770 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20   pSub->nOp);.   
12780 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12790 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20  b, pSub);.  }.  
127a0 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31  for(i=p->nzVar-1
127b0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c  ; i>=0; i--) sql
127c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
127d0 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76  ->azVar[i]);.  v
127e0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
127f0 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
12800 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
12810 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65  ree(db, p->aLabe
12820 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
12830 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
12840 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
12850 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
12860 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
12870 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
12880 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
12890 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
128a0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
128b0 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
128c0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
128d0 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
128e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
128f0 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
12900 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
12910 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
12920 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
12930 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
12940 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
12950 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
12960 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
12970 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
12980 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
12990 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
129a0 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
129b0 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
129c0 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
129d0 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
129e0 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
129f0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12a00 74 65 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  teObject(db, p);
12a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
12a20 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70  ure the cursor p
12a30 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61   is ready to rea
12a40 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72  d or write the r
12a50 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a  ow to which it.*
12a60 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74  * was last posit
12a70 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61  ioned.  Return a
12a80 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
12a90 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20  an OOM fault or 
12aa0 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65  I/O error.** pre
12ab0 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f  vents us from po
12ac0 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75  sitioning the cu
12ad0 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72  rsor to its corr
12ae0 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ect position..**
12af0 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
12b00 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
12b10 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
12b20 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
12b30 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
12b40 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76   now.  If no mov
12b50 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68  e is pending, ch
12b60 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
12b70 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a  e row has been.*
12b80 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  * deleted out fr
12b90 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
12ba0 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61  sor and if it ha
12bb0 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20  s, mark the row 
12bc0 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77  as.** a NULL row
12bd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
12be0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
12bf0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
12c00 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64   correct row and
12c10 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a   that row has.**
12c20 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65   not been delete
12c30 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
12c40 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65   the cursor, the
12c50 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
12c60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
12c70 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
12c80 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  sorMoveto(VdbeCu
12c90 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
12ca0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
12cb0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  o ){.    int res
12cc0 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
12cd0 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74  ITE_TEST.    ext
12ce0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
12cf0 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
12d00 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
12d10 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
12d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
12d30 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
12d40 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  ed(p->pCursor, 0
12d50 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
12d60 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  t, 0, &res);.   
12d70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
12d80 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74   rc;.    p->last
12d90 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74  Rowid = p->movet
12da0 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28  oTarget;.    if(
12db0 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
12dc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12dd0 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  BKPT;.    p->row
12de0 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23  idIsValid = 1;.#
12df0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
12e00 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  T.    sqlite3_se
12e10 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
12e20 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65  ndif.    p->defe
12e30 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
12e40 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
12e50 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
12e60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c  ;.  }else if( AL
12e70 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29  WAYS(p->pCursor)
12e80 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d   ){.    int hasM
12e90 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  oved;.    int rc
12ea0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12eb0 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
12ec0 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f  >pCursor, &hasMo
12ed0 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ved);.    if( rc
12ee0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12ef0 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29    if( hasMoved )
12f00 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65  {.      p->cache
12f10 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
12f20 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  TALE;.      p->n
12f30 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ullRow = 1;.    
12f40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
12f50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12f60 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
12f70 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
12f80 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
12f90 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
12fa0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
12fb0 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
12fc0 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
12fd0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
12fe0 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
12ff0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13000 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
13010 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
13020 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
13030 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
13040 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
13050 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
13060 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
13070 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
13080 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
13090 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
130a0 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
130b0 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
130c0 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
130d0 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
130e0 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
130f0 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
13100 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
13110 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
13120 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
13130 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
13140 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
13150 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
13160 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
13170 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
13180 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
13190 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
131a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
131b0 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
131c0 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
131d0 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
131e0 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
131f0 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
13200 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
13210 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
13220 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
13230 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a  lob seperately..
13240 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
13250 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
13260 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
13270 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
13280 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
13290 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
132a0 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
132b0 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
132c0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
132d0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
132e0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
132f0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
13300 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
13310 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13320 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
13330 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13340 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
13350 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13360 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13380 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
13390 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
133a0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
133b0 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
133c0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
133d0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
13400 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13410 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
13430 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
13440 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13450 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
13460 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
13470 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13480 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
134b0 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
134c0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
134d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
134e0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
134f0 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
13500 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
13510 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13520 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
13530 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
13540 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
13570 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
13580 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
13590 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
135a0 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
135b0 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
135c0 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
135d0 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
135e0 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
135f0 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
13600 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
13610 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
13620 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
13630 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
13640 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
13650 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
13660 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
13670 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
13680 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
13690 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
136a0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
136b0 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
136c0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
136d0 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
136e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pMem->flags;.  i
136f0 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61  nt n;..  if( fla
13700 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
13710 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13720 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
13730 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
13740 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
13750 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
13760 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
13770 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
13780 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
13790 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
137a0 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
137b0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
137c0 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69  64 u;.    if( fi
137d0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20  le_format>=4 && 
137e0 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20  (i&1)==i ){.    
137f0 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
13800 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
13810 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66   i<0 ){.      if
13820 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29  ( i<(-MAX_6BYTE)
13830 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20   ) return 6;.   
13840 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74     /* Previous t
13850 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75  est prevents:  u
13860 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36   = -(-9223372036
13870 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20  854775808) */.  
13880 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20      u = -i;.    
13890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
138a0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
138b0 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
138c0 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
138d0 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
138e0 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
138f0 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
13900 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
13910 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
13920 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
13930 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
13940 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
13950 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
13960 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
13970 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
13980 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
13990 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
139a0 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
139b0 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
139c0 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
139d0 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
139e0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
139f0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
13a00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13a10 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
13a20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
13a30 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
13a40 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
13a50 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
13a60 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
13a70 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
13a80 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
13a90 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
13aa0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
13ab0 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
13ac0 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
13ad0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
13ae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
13af0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
13b00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
13b10 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
13b20 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
13b30 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
13b40 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
13b50 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
13b60 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
13b70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
13b80 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
13b90 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
13ba0 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
13bb0 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
13bc0 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
13bd0 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
13be0 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
13bf0 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
13c00 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
13c10 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
13c20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
13c30 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
13c40 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
13c50 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
13c60 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
13c70 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
13c80 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
13c90 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
13ca0 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
13cb0 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
13cc0 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
13cd0 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
13ce0 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
13cf0 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
13d00 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
13d10 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
13d20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
13d30 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
13d40 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
13d50 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
13d60 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
13d70 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
13d80 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
13d90 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
13da0 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
13db0 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
13dc0 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
13dd0 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
13de0 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
13df0 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
13e00 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
13e10 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
13e20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
13e30 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
13e40 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
13e50 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
13e60 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
13e70 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
13e80 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
13e90 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
13ea0 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
13eb0 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
13ec0 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
13ed0 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
13ee0 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
13ef0 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
13f00 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
13f10 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
13f20 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
13f30 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
13f40 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
13f50 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
13f60 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
13f70 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
13f80 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
13f90 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
13fa0 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
13fb0 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
13fc0 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
13fd0 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
13fe0 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
13ff0 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
14000 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
14010 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
14020 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
14030 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
14040 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
14050 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
14060 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
14070 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
14080 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
14090 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
140a0 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
140b0 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
140c0 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
140d0 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
140e0 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
140f0 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
14100 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
14110 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
14120 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
14130 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
14140 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
14150 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
14160 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
14170 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
14180 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
14190 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
141a0 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
141b0 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
141c0 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
141d0 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
141e0 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
141f0 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
14200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
14210 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
14220 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
14230 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
14240 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
14250 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
14260 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
14270 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
14280 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
14290 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
142a0 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
142b0 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
142c0 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
142d0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
142e0 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
142f0 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
14300 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
14310 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
14320 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
14330 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
14340 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
14350 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
14360 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
14370 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
14380 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
14390 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
143a0 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
143b0 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
143c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
143d0 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
143e0 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
143f0 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
14400 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42  ft in buf[].  nB
14410 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  uf must always b
14420 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67  e.** large enoug
14430 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  h to hold the en
14440 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63  tire field.  Exc
14450 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c  ept, if the fiel
14460 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77  d is.** a blob w
14470 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  ith a zero-fille
14480 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66  d tail, then buf
14490 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74  [] might be just
144a0 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69   the right.** si
144b0 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79  ze to hold every
144c0 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72  thing except for
144d0 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
144e0 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d   tail.  If buf[]
144f0 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20  .** is only big 
14500 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
14510 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66  he non-zero pref
14520 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ix, then only wr
14530 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66  ite that.** pref
14540 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  ix into buf[].  
14550 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20  But if buf[] is 
14560 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
14570 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a  hold both the.**
14580 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20   prefix and the 
14590 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20  tail then write 
145a0 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
145b0 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61  et the tail to a
145c0 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a  ll.** zeros..**.
145d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
145e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
145f0 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
14600 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
14610 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
14620 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
14630 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
14640 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
14650 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
14660 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
14670 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
14680 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
14690 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
146a0 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e  lPut(u8 *buf, in
146b0 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  t nBuf, Mem *pMe
146c0 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
146d0 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  at){.  u32 seria
146e0 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
146f0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
14700 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Mem, file_format
14710 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  );.  u32 len;.. 
14720 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
14730 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
14740 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
14750 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
14760 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
14770 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
14780 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
14790 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
147a0 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
147b0 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
147c0 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
147d0 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
147e0 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
147f0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
14800 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14810 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
14820 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
14830 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
14840 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
14850 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
14860 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28    assert( len<=(
14870 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  u32)nBuf );.    
14880 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
14890 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38      buf[i] = (u8
148a0 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
148b0 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
148c0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
148d0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
148e0 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
148f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
14900 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
14910 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
14920 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
14930 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
14940 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
14950 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
14960 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14970 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
14980 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14990 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b  pMem->n<=nBuf );
149a0 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
149b0 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62  >n;.    memcpy(b
149c0 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
149d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  );.    if( pMem-
149e0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
149f0 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b  o ){.      len +
14a00 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
14a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
14a20 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Buf>=0 );.      
14a30 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e  if( len > (u32)n
14a40 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Buf ){.        l
14a50 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a  en = (u32)nBuf;.
14a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
14a70 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
14a80 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
14a90 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
14aa0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
14ab0 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
14ac0 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
14ad0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
14ae0 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
14af0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
14b00 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
14b10 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
14b20 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
14b30 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
14b40 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
14b50 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
14b60 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
14b70 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
14b80 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
14b90 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14ba0 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
14bb0 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
14bc0 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
14bd0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
14be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14bf0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
14c00 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
14c10 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
14c40 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
14c50 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
14c60 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
14c70 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
14c80 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
14c90 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
14ca0 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
14cb0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
14cc0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
14cd0 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
14ce0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
14cf0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
14d00 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
14d10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14d20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
14d30 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14d40 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
14d50 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
14d60 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
14d70 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14d80 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
14d90 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
14da0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
14db0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
14dc0 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
14dd0 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
14de0 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
14df0 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
14e00 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14e10 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
14e20 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
14e30 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
14e40 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
14e50 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
14e60 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
14e70 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
14e80 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
14e90 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
14ea0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
14eb0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
14ec0 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
14ed0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
14ee0 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
14ef0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
14f00 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
14f10 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
14f20 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
14f30 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
14f40 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
14f50 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
14f60 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
14f70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
14f80 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
14f90 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
14fa0 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
14fb0 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
14fc0 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
14fd0 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
14fe0 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
14ff0 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
15000 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
15010 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
15020 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
15030 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
15040 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
15050 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15060 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
15070 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
15080 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
15090 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
150a0 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
150b0 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
150c0 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
150d0 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
150e0 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
150f0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
15100 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15110 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15120 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
15130 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
15140 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
15150 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
15160 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
15170 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
15180 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
15190 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
151a0 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
151b0 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
151c0 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
151d0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
151e0 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
151f0 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
15200 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
15210 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
15220 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
15230 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
15240 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
15250 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
15260 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
15270 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
15280 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15290 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
152a0 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
152b0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
152c0 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
152d0 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
152e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78  .#endif..      x
152f0 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
15300 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
15310 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
15320 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d  uf[3];.      y =
15330 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20   (buf[4]<<24) | 
15340 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28  (buf[5]<<16) | (
15350 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[6]<<8) | buf
15360 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [7];.      x = (
15370 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
15380 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
15390 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
153a0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
153b0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
153c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
153d0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Int;.      }els
153e0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
153f0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
15400 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
15410 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
15420 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
15430 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
15440 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
15450 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
15460 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
15470 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
15480 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
15490 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
154a0 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
154b0 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
154c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
154d0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
154e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
154f0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
15500 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
15510 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
15520 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
15530 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
15540 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15550 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
15560 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c  t: {.      u32 l
15570 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
15580 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
15590 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
155a0 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
155b0 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
155c0 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
155d0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
155e0 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
155f0 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
15600 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
15610 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
15620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15630 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15640 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
15650 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
15660 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
15670 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15680 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  0;.}.../*.** Giv
15690 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
156a0 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
156b0 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
156c0 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65   parse the.** re
156d0 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61  cord into a Unpa
156e0 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
156f0 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20  ture.  Return a 
15700 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
15710 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  at structure..**
15720 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
15730 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70  function might p
15740 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62  rovide szSpace b
15750 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
15760 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63  * space at pSpac
15770 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63  e.  This space c
15780 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f  an be used to ho
15790 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  ld the returned.
157a0 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63  ** VDbeParsedRec
157b0 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66  ord structure if
157c0 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
157d0 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a  ugh.  If it is.*
157e0 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68  * not big enough
157f0 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69  , space is obtai
15800 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
15810 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  _malloc()..**.**
15820 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
15830 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62  ructure should b
15840 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61  e closed by a ca
15850 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
15860 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
15870 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a  edRecord()..*/ .
15880 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
15890 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
158a0 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
158b0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
158c0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
158d0 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
158e0 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
158f0 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
15900 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
15910 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
15920 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
15930 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
15940 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
15950 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  rd */.  char *pS
15960 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 2f  pace,          /
15970 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
15980 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68  e available to h
15990 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  old the object *
159a0 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20  /.  int szSpace 
159b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
159c0 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
159d0 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
159e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
159f0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
15a00 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15a10 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63   *)pKey;.  Unpac
15a20 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f  kedRecord *p;  /
15a30 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72  * The unpacked r
15a40 65 63 6f 72 64 20 74 68 61 74 20 77 65 20 77 69  ecord that we wi
15a50 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  ll return */.  i
15a60 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
15a70 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
15a80 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  ce needed to hol
15a90 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f  d p, in bytes */
15aa0 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33 32 20  .  int d;.  u32 
15ab0 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20  idx;.  u16 u;   
15ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
15ad0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
15ae0 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
15af0 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  dr;.  Mem *pMem;
15b00 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20  .  int nOff;    
15b10 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
15b20 73 65 20 70 53 70 61 63 65 20 62 79 20 74 68 69  se pSpace by thi
15b30 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79 74 65  s much to 8-byte
15b40 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a   align it */.  .
15b50 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e    /*.  ** We wan
15b60 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
15b70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
15b80 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
15b90 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
15ba0 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
15bb0 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
15bc0 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
15bd0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
15be0 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
15bf0 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
15c00 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
15c10 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
15c20 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
15c30 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
15c40 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
15c50 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
15c60 26 20 37 29 29 20 26 20 37 3b 0a 20 20 70 53 70  & 7)) & 7;.  pSp
15c70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73  ace += nOff;.  s
15c80 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a  zSpace -= nOff;.
15c90 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
15ca0 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
15cb0 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
15cc0 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
15cd0 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
15ce0 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
15cf0 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
15d00 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
15d10 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
15d20 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  te);.    if( p==
15d30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
15d40 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50    p->flags = UNP
15d50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20  ACKED_NEED_FREE 
15d60 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  | UNPACKED_NEED_
15d70 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65  DESTROY;.  }else
15d80 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
15d90 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70 61 63  kedRecord*)pSpac
15da0 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  e;.    p->flags 
15db0 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  = UNPACKED_NEED_
15dc0 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70  DESTROY;.  }.  p
15dd0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
15de0 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
15df0 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
15e00 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e  Field + 1;.  p->
15e10 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d  aMem = pMem = (M
15e20 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
15e30 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
15e40 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
15e50 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
15e60 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
15e70 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
15e80 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
15e90 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
15ea0 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
15eb0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
15ec0 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65  Hdr && u<p->nFie
15ed0 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b  ld && d<=nKey ){
15ee0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
15ef0 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b  type;..    idx +
15f00 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
15f10 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c  Key[idx], serial
15f20 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d  _type);.    pMem
15f30 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  ->enc = pKeyInfo
15f40 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d  ->enc;.    pMem-
15f50 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  >db = pKeyInfo->
15f60 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d  db;.    /* pMem-
15f70 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73  >flags = 0; // s
15f80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15f90 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74  Get() will set t
15fa0 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  his for us */.  
15fb0 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20    pMem->zMalloc 
15fc0 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
15fd0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
15fe0 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
15ff0 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
16000 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
16010 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65   u++;.  }.  asse
16020 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
16030 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
16040 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
16050 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
16060 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
16070 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79   routine destroy
16080 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  s a UnpackedReco
16090 72 64 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  rd object..*/.vo
160a0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
160b0 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
160c0 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  rd(UnpackedRecor
160d0 64 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  d *p){.#ifdef SQ
160e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74  LITE_DEBUG.  int
160f0 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   i;.  Mem *pMem;
16100 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
16110 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16120 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
16130 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29  D_NEED_DESTROY )
16140 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65  ;.  for(i=0, pMe
16150 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e  m=p->aMem; i<p->
16160 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65  nField; i++, pMe
16170 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  m++){.    /* The
16180 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
16190 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74   is always const
161a0 72 75 63 74 65 64 20 62 79 20 74 68 65 0a 20 20  ructed by the.  
161b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
161c0 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66  UnpackRecord() f
161d0 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77  unction above, w
161e0 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20  hich makes all. 
161f0 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e     ** strings an
16200 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20  d blobs static. 
16210 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
16220 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20   elements are.  
16230 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66    ** ever transf
16240 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20  ormed, so there 
16250 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e  is never anythin
16260 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20  g to delete..   
16270 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
16280 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29  R(pMem->zMalloc)
16290 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
162a0 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
162b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
162c0 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41   p->flags & UNPA
162d0 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 29  CKED_NEED_FREE )
162e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
162f0 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  ree(p->pKeyInfo-
16300 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  >db, p);.  }.}..
16310 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16320 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
16330 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
16340 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
16350 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
16360 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
16370 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
16380 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
16390 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
163a0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
163b0 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
163c0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
163d0 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
163e0 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
163f0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
16400 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
16410 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
16420 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
16430 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
16440 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
16450 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
16460 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
16470 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
16480 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
16490 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
164a0 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
164b0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
164c0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
164d0 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
164e0 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74  ..** The key wit
164f0 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69  h fewer fields i
16500 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72  s usually compar
16510 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
16520 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e   .** longer key.
16530 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65    However if the
16540 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
16550 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79  Y flags in pPKey
16560 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20  2 is set.** and 
16570 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
16580 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  xes are equal, t
16590 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73  hen key1 is less
165a0 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f   than key2..** O
165b0 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
165c0 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66  D_MATCH_PREFIX f
165d0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
165e0 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a  he prefixes are.
165f0 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  ** equal, then t
16600 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73  he keys are cons
16610 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
16620 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61  al and.** the pa
16630 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63  rts beyond the c
16640 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65  ommon prefix are
16650 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
16660 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
16670 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61  IGNORE_ROWID fla
16680 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
16690 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
166a0 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
166b0 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65   pKey1 is ignore
166c0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
166d0 64 20 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a  d that pKey1 is.
166e0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c  ** an index key,
166f0 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77   and thus ends w
16700 69 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75  ith a rowid valu
16710 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79 74  e.  The last byt
16720 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64  e.** of the head
16730 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  er will therefor
16740 65 20 62 65 20 74 68 65 20 73 65 72 69 61 6c 20  e be the serial 
16750 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
16760 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20  d:.** one of 1, 
16770 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38  2, 3, 4, 5, 6, 8
16780 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74  , or 9 - the int
16790 65 67 65 72 20 73 65 72 69 61 6c 20 74 79 70 65  eger serial type
167a0 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c  s..** The serial
167b0 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e   type of the fin
167c0 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c  al rowid will al
167d0 77 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65  ways be a single
167e0 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e   byte..** By ign
167f0 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20  oring this last 
16800 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
16810 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65  er, we force the
16820 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74   comparison.** t
16830 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77  o ignore the row
16840 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
16850 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71   key1..*/.int sq
16860 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
16870 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
16880 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
16890 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
168a0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
168b0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
168c0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
168d0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  key */.){.  int 
168e0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
168f0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
16900 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
16910 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
16920 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
16930 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
16940 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
16950 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
16960 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
16970 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16980 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
16990 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
169a0 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
169b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
169c0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
169d0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
169e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
169f0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
16a00 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16a10 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
16a20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
16a30 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
16a40 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
16a50 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
16a60 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
16a70 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
16a80 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
16a90 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
16aa0 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
16ab0 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
16ac0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a  VVA_ONLY( mem1.z
16ad0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
16ae0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
16af0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
16b00 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
16b10 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
16b20 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
16b30 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
16b40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16b50 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
16b60 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
16b70 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
16b80 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
16b90 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
16ba0 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
16bb0 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
16bc0 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
16bd0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
16be0 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
16bf0 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
16c00 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
16c10 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
16c20 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
16c30 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
16c40 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
16c50 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
16c60 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
16c70 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
16c80 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
16c90 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
16ca0 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
16cb0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
16cc0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
16cd0 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
16ce0 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
16cf0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
16d00 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
16d10 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
16d20 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
16d30 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
16d40 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
16d50 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
16d60 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
16d70 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  ORE_ROWID ){.   
16d80 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20   szHdr1--;.  }. 
16d90 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
16da0 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
16db0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
16dc0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
16dd0 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
16de0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
16df0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
16e00 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
16e10 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
16e20 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
16e30 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
16e40 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
16e50 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
16e60 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
16e70 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
16e80 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
16e90 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
16ea0 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
16eb0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
16ec0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
16ed0 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
16ee0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
16ef0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
16f00 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
16f10 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
16f20 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
16f30 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
16f40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16f50 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
16f60 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
16f70 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
16fa0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
16fb0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
16fc0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
16fd0 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
16fe0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
16ff0 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a  mment below */..
17000 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20        /* Invert 
17010 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65  the result if we
17020 20 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20   are using DESC 
17030 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
17040 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
17050 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
17060 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65   i<nField && pKe
17070 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
17080 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
17090 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
170a0 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }.    .      /* 
170b0 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  If the PREFIX_SE
170c0 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ARCH flag is set
170d0 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20   and all fields 
170e0 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c  except the final
170f0 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  .      ** rowid 
17100 66 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c  field were equal
17110 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
17120 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
17130 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20  lag and set .   
17140 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f     ** pPKey2->ro
17150 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  wid to the value
17160 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
17170 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e  eld in (pKey1, n
17180 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20  Key1)..      ** 
17190 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
171a0 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
171b0 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  opcode..      */
171c0 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65  .      if( (pPKe
171d0 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
171e0 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52  CKED_PREFIX_SEAR
171f0 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79  CH) && i==(pPKey
17200 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a  2->nField-1) ){.
17210 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17220 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20  idx1==szHdr1 && 
17230 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rc );.        as
17240 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73  sert( mem1.flags
17250 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
17260 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c        pPKey2->fl
17270 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44  ags &= ~UNPACKED
17280 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a  _PREFIX_SEARCH;.
17290 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
172a0 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69  rowid = mem1.u.i
172b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
172c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
172d0 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
172e0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f   }..  /* No memo
172f0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
17300 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
17310 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
17320 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
17330 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
17340 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
17350 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
17360 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
17370 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
17380 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
17390 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
173a0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
173b0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
173c0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
173d0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
173e0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
173f0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
17400 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
17410 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
17420 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
17430 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
17440 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
17450 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c  _INCRKEY.  ** fl
17460 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
17470 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
17480 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
17490 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49  s larger..  ** I
174a0 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52  f the UPACKED_PR
174b0 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20  EFIX_MATCH flag 
174c0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79  is set, then key
174d0 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72  s with common pr
174e0 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20  efixes.  ** are 
174f0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
17500 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69   equal.  Otherwi
17510 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b  se, the longer k
17520 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20  ey is the .  ** 
17530 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68  larger.  As it h
17540 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65  appens, the pPKe
17550 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  y2 will always b
17560 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a  e the longer.  *
17570 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
17580 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
17590 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
175a0 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32   );.  if( pPKey2
175b0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
175c0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
175d0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c    rc = -1;.  }el
175e0 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  se if( pPKey2->f
175f0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
17600 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a  PREFIX_MATCH ){.
17610 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
17620 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  =0 */.  }else if
17630 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b  ( idx1<szHdr1 ){
17640 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
17650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17660 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
17670 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
17680 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
17690 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
176a0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
176b0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
176c0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
176d0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
176e0 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
176f0 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
17700 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
17710 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
17720 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
17730 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
17740 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
17750 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
17760 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
17770 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
17780 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
17790 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
177a0 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
177b0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
177c0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
177d0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
177e0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
177f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
17800 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
17810 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
17820 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
17830 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
17840 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
17850 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
17860 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
17870 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
17880 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
17890 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
178a0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
178b0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
178c0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
178d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
178e0 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  TER(db);..  /* G
178f0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
17900 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
17910 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
17920 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
17930 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
17940 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
17950 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
17960 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
17970 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
17980 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
17990 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
179a0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
179b0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
179c0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
179d0 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
179e0 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
179f0 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
17a00 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
17a10 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
17a20 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
17a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17a40 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
17a50 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
17a60 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
17a70 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
17a80 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
17a90 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
17aa0 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
17ab0 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
17ac0 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
17ad0 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
17ae0 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
17af0 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
17b00 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
17b10 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
17b20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
17b30 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
17b40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
17b50 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
17b60 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
17b70 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
17b80 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
17b90 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
17ba0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
17bb0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
17bc0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
17bd0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
17be0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
17bf0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
17c00 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
17c10 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
17c20 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
17c30 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
17c40 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
17c50 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17c60 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17c70 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
17c80 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
17c90 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
17ca0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
17cb0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
17cc0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
17cd0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
17ce0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
17cf0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
17d00 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
17d10 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
17d20 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
17d30 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
17d40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17d50 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
17d60 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17d70 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
17d80 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17d90 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
17da0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
17db0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17dc0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
17dd0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17de0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
17df0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17e00 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
17e10 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
17e20 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
17e30 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
17e40 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
17e50 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17e60 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
17e70 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
17e80 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
17e90 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
17ea0 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
17eb0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
17ec0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17ed0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
17ee0 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
17ef0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
17f00 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
17f10 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
17f20 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
17f30 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
17f40 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
17f50 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
17f60 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
17f70 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
17f80 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
17f90 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
17fa0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
17fb0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
17fc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
17fd0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
17fe0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
17ff0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
18000 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
18010 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
18020 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
18030 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
18040 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
18050 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
18060 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
18070 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21  case( m.zMalloc!
18080 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
18090 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
180a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
180b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
180c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
180d0 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
180e0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
180f0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
18100 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
18110 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
18120 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
18130 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
18140 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
18150 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
18160 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
18170 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
18180 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
18190 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
181a0 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
181b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
181c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
181d0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
181e0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
181f0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
18200 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
18210 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
18220 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
18230 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
18240 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
18250 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
18260 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
18270 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
18280 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
18290 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
182a0 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
182b0 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
182c0 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
182d0 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
182e0 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
182f0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
18300 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65  yCompare(.  Vdbe
18310 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
18320 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
18330 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
18340 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
18350 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
18360 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70  npacked,  /* Unp
18370 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
18380 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
18390 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
183a0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
183b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
183c0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
183d0 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
183e0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
183f0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
18400 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
18410 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
18420 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
18430 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
18440 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
18450 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  Cur) );.  rc = s
18460 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
18470 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
18480 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
18490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
184a0 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
184b0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
184c0 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
184d0 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
184e0 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
184f0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
18500 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
18510 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20  se of the say.  
18520 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
18530 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
18540 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
18550 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
18560 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
18570 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
18580 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
18590 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
185a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
185b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
185c0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
185d0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
185e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
185f0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
18600 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
18610 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
18620 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
18630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
18640 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
18650 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67   pUnpacked->flag
18660 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
18670 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a  ORE_ROWID );.  *
18680 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
18690 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
186a0 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
186b0 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
186c0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
186d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
186e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
186f0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
18700 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
18710 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
18720 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
18730 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
18740 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
18750 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
18760 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
18770 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
18780 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
18790 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
187a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
187b0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
187c0 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
187d0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
187e0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
187f0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
18800 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
18810 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
18820 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
18830 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
18840 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
18850 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
18860 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
18870 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
18880 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
18890 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
188a0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
188b0 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
188c0 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
188d0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
188e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
188f0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
18900 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
18910 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
18920 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
18930 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
18940 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
18950 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
18960 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
18970 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
18980 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
18990 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
189a0 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
189b0 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
189c0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
189d0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
189e0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
189f0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
18a00 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
18a10 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
18a20 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
18a30 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
18a40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18a50 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
18a60 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
18a70 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
18a80 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
18a90 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
18aa0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
18ab0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
18ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18ad0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
18ae0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
18af0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
18b00 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
18b10 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
18b20 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
18b30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
18b40 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
18b50 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
18b60 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
18b70 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
18b80 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
18b90 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
18ba0 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
18bb0 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
18bc0 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
18bd0 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
18be0 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
18bf0 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
18c00 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
18c10 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
18c20 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
18c30 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
18c40 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
18c50 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
18c60 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
18c70 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
18c80 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
18c90 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
18ca0 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
18cb0 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  etValue(Vdbe *v,
18cc0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
18cd0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
18ce0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
18cf0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
18d00 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
18d10 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
18d20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
18d30 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
18d40 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
18d50 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
18d60 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
18d70 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
18d80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18d90 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
18da0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
18db0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18dc0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
18dd0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
18de0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
18df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
18e00 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d  emStoreType((Mem
18e10 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20   *)pRet);.      
18e20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
18e30 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
18e40 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18e50 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
18e60 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
18e70 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
18e80 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
18e90 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
18ea0 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
18eb0 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
18ec0 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
18ed0 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
18ee0 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
18ef0 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
18f00 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
18f10 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
18f20 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
18f30 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
18f40 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
18f50 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
18f60 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
18f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
18f80 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
18f90 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
18fa0 20 20 7d 0a 7d 0a                                  }.}.