/ Hex Artifact Content
Login

Artifact 17bee21d513b8567f2e010aea287e81e9e6e273f:


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 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3100: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 7c  pcode==OP_Next |
3110: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  | opcode==OP_Sor
3120: 74 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  terNext ){.     
3130: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
3140: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
3150: 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d  Next;.      pOp-
3160: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
3170: 41 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ANCE;.    }else 
3180: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50  if( opcode==OP_P
3190: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  rev ){.      pOp
31a0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
31b0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
31c0: 69 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ious;.      pOp-
31d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
31e0: 41 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ANCE;.    }..   
31f0: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
3200: 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  gs & OPFLG_JUMP)
3210: 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  !=0 && pOp->p2<0
3220: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
3230: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
3240: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
3250: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
3260: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
3270: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
3280: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
3290: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
32a0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
32b0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
32c0: 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  MaxArgs;.}../*.*
32d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
32e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
32f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3300: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3310: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3320: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3330: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3340: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3350: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
3360: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
3370: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3380: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
3390: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
33a0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
33b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
33c0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
33d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
33e0: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
33f0: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3400: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3410: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3420: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3430: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3440: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
3450: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
3460: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
3470: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3480: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
3490: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
34a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
34b0: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
34c0: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
34d0: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
34e0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
34f0: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3500: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3510: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3520: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3530: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3540: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
3550: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
3560: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
3570: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
3580: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
3590: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
35a0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
35b0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
35c0: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
35d0: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
35e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
35f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3600: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3610: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3620: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3630: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3640: 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a  btreeMask==0 );.
3650: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
3660: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
3670: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
3680: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
3690: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
36a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
36b0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
36c0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
36d0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
36e0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
36f0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
3700: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
3710: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3720: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
3730: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
3740: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
3750: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
3760: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
3770: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3780: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
3790: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
37a0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
37b0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20   growOpArray(p) 
37c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
37d0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
37e0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41  >nOp;.  if( ALWA
37f0: 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20  YS(nOp>0) ){.   
3800: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
3810: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
3820: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
3830: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
3840: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
3850: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
3860: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
3870: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
3880: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
3890: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
38a0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
38b0: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
38c0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
38d0: 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70  <0 && (sqlite3Op
38e0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75  codeProperty[pOu
38f0: 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  t->opcode] & OPF
3900: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20  LG_JUMP)!=0 ){. 
3910: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3920: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
3930: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3940: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
3950: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
3960: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
3970: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
3980: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
3990: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
39a0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
39b0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
39c0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
39d0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
39e0: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
39f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
3a00: 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
3a10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
3a20: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
3a30: 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61  0, i+addr, &p->a
3a40: 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20  Op[i+addr]);.   
3a50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3a60: 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20  }.    p->nOp += 
3a70: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nOp;.  }.  retur
3a80: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
3a90: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3aa0: 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72  e of the P1 oper
3ab0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3ac0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3ad0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ae0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
3af0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
3b00: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
3b10: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
3b20: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
3b30: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
3b40: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
3b50: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
3b60: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
3b70: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
3b80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3b90: 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  1(Vdbe *p, u32 a
3ba0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
3bb0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3bc0: 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e  .  if( ((u32)p->
3bd0: 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20  nOp)>addr ){.   
3be0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
3bf0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
3c00: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3c10: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
3c20: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3c30: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3c40: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3c50: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3c60: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3c70: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3c80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3c90: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
3ca0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
3cb0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3cc0: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28   p!=0 );.  if( (
3cd0: 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64  (u32)p->nOp)>add
3ce0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3cf0: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
3d00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3d10: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3d20: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
3d30: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3d40: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
3d50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3d60: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
3d70: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
3d80: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3d90: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
3da0: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
3db0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
3dc0: 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20  dr].p3 = val;.  
3dd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3de0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3df0: 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f  he P5 operand fo
3e00: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
3e10: 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65  tly.** added ope
3e20: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
3e30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3e40: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
3e50: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3e60: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  p!=0 );.  if( p-
3e70: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >aOp ){.    asse
3e80: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
3e90: 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f      p->aOp[p->nO
3ea0: 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20  p-1].p5 = val;. 
3eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3ec0: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
3ed0: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
3ee0: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
3ef0: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3f00: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
3f10: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
3f20: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
3f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3f40: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
3f50: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
3f60: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
3f70: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
3f80: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
3f90: 20 61 64 64 72 3e 3d 30 20 29 20 73 71 6c 69 74   addr>=0 ) sqlit
3fa0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
3fb0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
3fc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
3fd0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
3fe0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
3ff0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
4000: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
4010: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
4020: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
4030: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
4040: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
4050: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
4070: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
4080: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
4090: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
40a0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
40b0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
40c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
40d0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
40e0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
40f0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4100: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
4110: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
4120: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
4130: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
4140: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
4150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4160: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
4170: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20  ){.  if( p4 ){. 
4180: 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b     assert( db );
4190: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
41a0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
41b0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
41c0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
41d0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59        case P4_DY
41e0: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73  NAMIC:.      cas
41f0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20  e P4_KEYINFO:.  
4200: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4210: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65  RRAY:.      case
4220: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
4230: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
4240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4250: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72   p4);.        br
4260: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4270: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
4280: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
4290: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
42a0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
42b0: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
42c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
42d0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
42e0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
42f0: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
4300: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
4310: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
4320: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4330: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
4340: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
4350: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4360: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4370: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
4380: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
4390: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
43a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
43b0: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
43c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
43d0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
43e0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
43f0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4400: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4410: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4430: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4440: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
4450: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4460: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4480: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
4490: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
44a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
44b0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
44c0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
44d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
44e0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
44f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4530: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4540: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
4550: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4560: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
4570: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
4580: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
4590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
45b0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
45c0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
45d0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
45e0: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
45f0: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
4600: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
4610: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
4620: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
4630: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
4640: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
4650: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
4660: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4670: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
4680: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
4690: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
46a0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
46b0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
46c0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
46d0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
46e0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
46f0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4700: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4710: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4720: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4730: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4740: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4750: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4760: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4770: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
4780: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
4790: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
47a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
47b0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
47c0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
47d0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
47e0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
47f0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4800: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4810: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4820: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4830: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4840: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4850: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4860: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
4870: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
4880: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
4890: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
48a0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
48b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
48c0: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
48d0: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76  nto OP_Noop.*/.v
48e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
48f0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
4900: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
4910: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
4920: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
4930: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
4940: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4950: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72   = p->db;.    fr
4960: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4970: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4980: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70  ;.    memset(pOp
4990: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
49a0: 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f  0]));.    pOp->o
49b0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
49c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
49d0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
49e0: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
49f0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4a00: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4a10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4a20: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
4a30: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
4a40: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
4a50: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
4a60: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4a70: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
4a80: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
4a90: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
4aa0: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
4ab0: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
4ac0: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
4ad0: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
4ae0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
4af0: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
4b00: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
4b10: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4b20: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
4b30: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
4b40: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
4b50: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
4b60: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
4b70: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
4b80: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
4b90: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
4ba0: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
4bb0: 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP4..**.** If n=
4bc0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P4_KEYINFO it m
4bd0: 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73  eans that zP4 is
4be0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4bf0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4c00: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
4c10: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
4c20: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
4c30: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4c40: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
4c50: 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65  e3_malloc, to be
4c60: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4c70: 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  Vdbe is finalize
4c80: 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49  d..** n==P4_KEYI
4c90: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69  NFO_HANDOFF indi
4ca0: 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70  cates that zP4 p
4cb0: 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
4cc0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
4cd0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
4ce0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
4cf0: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   has obtained fr
4d00: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4d10: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
4d20: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
4d30: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
4d40: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
4d50: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
4d60: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
4d70: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
4d80: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
4d90: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
4da0: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
4db0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4dc0: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
4dd0: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
4de0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
4df0: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
4e00: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
4e10: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
4e20: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
4e30: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
4e40: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
4e50: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
4e60: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
4e70: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
4e80: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
4e90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4ea0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
4eb0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
4ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
4ed0: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
4ee0: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
4ef0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
4f00: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
4f10: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
4f20: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4f30: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
4f40: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
4f50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
4f60: 0a 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f  .    if ( n!=P4_
4f70: 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34  KEYINFO && n!=P4
4f80: 5f 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20  _VTAB ) {.      
4f90: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
4fa0: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
4fb0: 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P4);.    }.    r
4fc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
4fd0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
4fe0: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
4ff0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
5000: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
5010: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5020: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
5030: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
5040: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
5050: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
5060: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
5070: 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49  0;.  if( n==P4_I
5080: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
5090: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
50a0: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
50b0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
50c0: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
50d0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
50e0: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
50f0: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
5100: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
5110: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
5120: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5130: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
5140: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
5150: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  4==0 ){.    pOp-
5160: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
5170: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5180: 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65  NOTUSED;.  }else
5190: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
51a0: 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  FO ){.    KeyInf
51b0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
51c0: 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79   int nField, nBy
51d0: 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20  te;..    nField 
51e0: 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34  = ((KeyInfo*)zP4
51f0: 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e  )->nField;.    n
5200: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
5210: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65  KeyInfo) + (nFie
5220: 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65  ld-1)*sizeof(pKe
5230: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29  yInfo->aColl[0])
5240: 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70   + nField;.    p
5250: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
5260: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
5270: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d  nByte);.    pOp-
5280: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  >p4.pKeyInfo = p
5290: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28  KeyInfo;.    if(
52a0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
52b0: 20 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65     u8 *aSortOrde
52c0: 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
52d0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
52e0: 20 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46   zP4, nByte - nF
52f0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f  ield);.      aSo
5300: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
5310: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a  fo->aSortOrder;.
5320: 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f        if( aSortO
5330: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
5340: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5350: 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  rder = (unsigned
5360: 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f   char*)&pKeyInfo
5370: 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b  ->aColl[nField];
5380: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
5390: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
53a0: 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72  rder, aSortOrder
53b0: 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  , nField);.     
53c0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34   }.      pOp->p4
53d0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
53e0: 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  O;.    }else{.  
53f0: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
5400: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
5410: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5420: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
5430: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
5440: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
5450: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
5460: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
5470: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5480: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
5490: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
54a0: 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  =P4_VTAB ){.    
54b0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
54c0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
54d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41  >p4type = P4_VTA
54e0: 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  B;.    sqlite3Vt
54f0: 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  abLock((VTable *
5500: 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72  )zP4);.    asser
5510: 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  t( ((VTable *)zP
5520: 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  4)->db==p->db );
5530: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30  .  }else if( n<0
5540: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5550: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5560: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5570: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e  = (signed char)n
5580: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5590: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71  f( n==0 ) n = sq
55a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
55b0: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  4);.    pOp->p4.
55c0: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  z = sqlite3DbStr
55d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c  NDup(p->db, zP4,
55e0: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34   n);.    pOp->p4
55f0: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
5600: 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  C;.  }.}..#ifnde
5610: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  f NDEBUG./*.** C
5620: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
5630: 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73  t on the the mos
5640: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
5650: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
5660: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
5670: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
5680: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
5690: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
56a0: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
56b0: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
56c0: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
56d0: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
56e0: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
56f0: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
5700: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
5710: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
5720: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
5730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
5740: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
5750: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
5760: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
5770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
5780: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
5790: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
57a0: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
57b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
57c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
57d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
57e0: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
57f0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5800: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5810: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
5820: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5830: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
5840: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
5850: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
5860: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
5870: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
5880: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
5890: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
58a0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
58b0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
58c0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
58d0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
58e0: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
58f0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5900: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5910: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5920: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
5930: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5940: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5950: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5960: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
5970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
5980: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
5990: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
59a0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
59b0: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
59c0: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
59d0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
59e0: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
59f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5a00: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
5a10: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
5a20: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
5a30: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
5a40: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
5a50: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
5a60: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
5a70: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
5a80: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
5a90: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
5aa0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
5ab0: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
5ac0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
5ad0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
5ae0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
5af0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
5b00: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
5b10: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
5b20: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
5b30: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
5b40: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
5b50: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
5b60: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
5b70: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
5b80: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
5b90: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f  ing.** after a O
5ba0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
5bb0: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
5bc0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
5bd0: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
5be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
5bf0: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
5c00: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
5c10: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
5c20: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
5c30: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
5c40: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
5c50: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
5c60: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
5c70: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
5c80: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a  th Valgrind..**.
5c90: 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66  ** About the #if
5ca0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5cb0: 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79  TRACE:  Normally
5cc0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5cd0: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a  s never called.*
5ce0: 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e  * unless p->nOp>
5cf0: 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  0.  This is beca
5d00: 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e  use in the absen
5d10: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
5d20: 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f  T_TRACE,.** an O
5d30: 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74  P_Trace instruct
5d40: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e  ion is always in
5d50: 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  serted by sqlite
5d60: 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f  3VdbeGet() as so
5d70: 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56  on as.** a new V
5d80: 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20  DBE is created. 
5d90: 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20   So we are free 
5da0: 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70  to set addr to p
5db0: 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a  ->nOp-1 without.
5dc0: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75  ** having to dou
5dd0: 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ble-check to mak
5de0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
5df0: 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65  result is non-ne
5e00: 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69  gative. But.** i
5e10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5e20: 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20  ACE is defined, 
5e30: 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20  the OP_Trace is 
5e40: 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64  omitted and we d
5e50: 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65  o need to.** che
5e60: 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ck the value of 
5e70: 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20  p->nOp-1 before 
5e80: 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56  continuing..*/.V
5e90: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5ea0: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
5eb0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
5ec0: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
5ed0: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
5ee0: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
5ef0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
5f00: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
5f10: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
5f20: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
5f30: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
5f40: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
5f50: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
5f60: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
5f70: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
5f80: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
5f90: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
5fa0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
5fb0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
5fc0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
5fd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5fe0: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
5ff0: 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74   p->nOp==0 ) ret
6000: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
6010: 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mmy;.#endif.    
6020: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
6030: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
6040: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
6050: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
6060: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6070: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
6080: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
60a0: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
60b0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
60c0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
60d0: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
60e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
60f0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
6100: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
6110: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
6120: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
6130: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6140: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
6150: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
6160: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
6170: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
6180: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
6190: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
61a0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
61b0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
61c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
61d0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
61e0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
61f0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
6200: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
6210: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
6220: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
6230: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
6240: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
6250: 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20  EYINFO_STATIC:. 
6260: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
6270: 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  FO: {.      int 
6280: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  i, j;.      KeyI
6290: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
62a0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
62b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
62c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
62d0: 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28  zTemp, "keyinfo(
62e0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
62f0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
6300: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6310: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
6320: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
6330: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
6340: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
6350: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
6360: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
6370: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
6380: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
6390: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
63a0: 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e  rlen30(pColl->zN
63b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
63c0: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20  if( i+n>nTemp-6 
63d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
63e0: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
63f0: 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20  ",...",4);.     
6400: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6420: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
6430: 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20   ',';.          
6440: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
6450: 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79  ortOrder && pKey
6460: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6470: 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [j] ){.         
6480: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6490: 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '-';.          }
64a0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
64b0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f  y(&zTemp[i], pCo
64c0: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a  ll->zName,n+1);.
64d0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e            i += n
64e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
64f0: 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20  if( i+4<nTemp-6 
6500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
6510: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c  cpy(&zTemp[i],",
6520: 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20  nil",4);.       
6530: 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
6540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6550: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6560: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
6570: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
6580: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
6590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
65a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
65b0: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
65c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
65d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
65e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
65f0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6600: 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28  zTemp, "collseq(
6610: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
6620: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
6630: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6640: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
6650: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
6660: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
6670: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
6680: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6690: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
66a0: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
66b0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
66c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
66e0: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
66f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6700: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
6710: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
6720: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
6730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6740: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
6750: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6760: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6770: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
6780: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
6790: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
67a0: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
67b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
67c0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
67d0: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
67e0: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
67f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6800: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
6810: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
6820: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
6830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
6840: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
6850: 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  _Null)==0 );.   
6860: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
6870: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
6880: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
6890: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
68a0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
68b0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
68c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
68d0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
68e0: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70  zTemp, "%lld", p
68f0: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
6900: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
6910: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
6920: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
6930: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6940: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
6950: 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20  6g", pMem->r);. 
6960: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6970: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
6980: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
6990: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
69a0: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
69b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
69c0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
69d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
69e0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
69f0: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
6a00: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
6a10: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
6a20: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
6a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6a40: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6a50: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
6a60: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
6a70: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
6a80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6a90: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
6aa0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
6ab0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6ac0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6ad0: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
6ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6af0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
6b00: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
6b10: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6b20: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6b30: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
6b40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6b50: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
6b60: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
6b70: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b90: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6ba0: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
6bb0: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
6bc0: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
6bd0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
6be0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6bf0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6c00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
6c10: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
6c20: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
6c30: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
6c40: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
6c50: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
6c60: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
6c70: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
6c80: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
6c90: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
6ca0: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
6cb0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
6cc0: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
6cd0: 74 61 62 61 73 65 73 20 74 68 61 74 20 74 68 65  tabases that the
6ce0: 79 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 2e  y will be using.
6cf0: 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73    A mask of thes
6d00: 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69  e databases.** i
6d10: 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20  s maintained in 
6d20: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 61 6e 64  p->btreeMask and
6d30: 20 69 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63   is used for loc
6d40: 6b 69 6e 67 20 61 6e 64 20 6f 74 68 65 72 20 70  king and other p
6d50: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
6d60: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
6d70: 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69  Btree(Vdbe *p, i
6d80: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
6d90: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
6da0: 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29  ->nDb && i<(int)
6db0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a  sizeof(yDbMask)*
6dc0: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  8 );.  assert( i
6dd0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e  <(int)sizeof(p->
6de0: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
6df0: 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c    p->btreeMask |
6e00: 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c  = ((yDbMask)1)<<
6e10: 69 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  i;.  if( i!=1 &&
6e20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
6e30: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
6e40: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
6e50: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28  p->lockMask |= (
6e60: 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (yDbMask)1)<<i;.
6e70: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6e80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6e90: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
6ea0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
6eb0: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  FE>0./*.** If SQ
6ec0: 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64  Lite is compiled
6ed0: 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72   to support shar
6ee0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e  ed-cache mode an
6ef0: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
6f00: 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  fe,.** this rout
6f10: 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20  ine obtains the 
6f20: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
6f30: 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61   with each BtSha
6f40: 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  red structure.**
6f50: 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63   that may be acc
6f60: 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20  essed by the VM 
6f70: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
6f80: 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20  ument. In doing 
6f90: 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65  so it also.** se
6fa0: 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ts the BtShared.
6fb0: 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63  db member of eac
6fc0: 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  h of the BtShare
6fd0: 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e  d structures, en
6fe0: 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  suring.** that t
6ff0: 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d  he correct busy-
7000: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
7010: 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72   is invoked if r
7020: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
7030: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
7040: 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64  threadsafe but d
7050: 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72  oes support shar
7060: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
7070: 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  hen.** sqlite3Bt
7080: 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e  reeEnter() is in
7090: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65  voked to set the
70a0: 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72   BtShared.db var
70b0: 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c  iables.** of all
70c0: 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72   of BtShared str
70d0: 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62  uctures accessib
70e0: 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62  le via the datab
70f0: 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61  ase handle .** a
7100: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
7110: 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  he VM..**.** If 
7120: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
7130: 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65  readsafe and doe
7140: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
7150: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
7160: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
7170: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
7180: 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65  .** The p->btree
7190: 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20  Mask field is a 
71a0: 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62  bitmask of all b
71b0: 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70  trees that the p
71c0: 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74  repared .** stat
71d0: 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65  ement p will eve
71e0: 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65  r use.  Let N be
71f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
7200: 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  its in p->btreeM
7210: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
7220: 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74  ding to btrees t
7230: 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63  hat use shared c
7240: 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20  ache.  Then the 
7250: 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  runtime of.** th
7260: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a  is routine is N*
7270: 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20  N.  But as N is 
7280: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
7290: 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20   1, this should 
72a0: 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62  not.** be a prob
72b0: 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
72c0: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64  ite3VdbeEnter(Vd
72d0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
72e0: 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b  .  yDbMask mask;
72f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7300: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
7310: 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c   nDb;.  if( p->l
7320: 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74  ockMask==0 ) ret
7330: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
7340: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
7350: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
7360: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
7370: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
7380: 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69  r(i=0, mask=1; i
7390: 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20  <nDb; i++, mask 
73a0: 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66  += mask){.    if
73b0: 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20  ( i!=1 && (mask 
73c0: 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d  & p->lockMask)!=
73d0: 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  0 && ALWAYS(aDb[
73e0: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
73f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
7400: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
7410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
7420: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
7430: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7440: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
7450: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
7460: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
7470: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
7480: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
7490: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
74a0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
74b0: 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ter()..*/.void s
74c0: 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
74d0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
74e0: 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73  i;.  yDbMask mas
74f0: 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k;.  sqlite3 *db
7500: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
7510: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d  nt nDb;.  if( p-
7520: 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72  >lockMask==0 ) r
7530: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
7540: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
7550: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
7560: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
7570: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
7580: 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b  for(i=0, mask=1;
7590: 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73   i<nDb; i++, mas
75a0: 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20  k += mask){.    
75b0: 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73  if( i!=1 && (mas
75c0: 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  k & p->lockMask)
75d0: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44  !=0 && ALWAYS(aD
75e0: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
75f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7600: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
7610: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
7620: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
7630: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
7640: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
7650: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
7660: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
7670: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
7680: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
7690: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
76a0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
76b0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
76c0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
76d0: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
76e0: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20  ar *zP4;.  char 
76f0: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74  zPtr[50];.  stat
7700: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
7710: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
7720: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
7730: 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22   %-4s %.2X %s\n"
7740: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
7750: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
7760: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
7770: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
7780: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66  zeof(zPtr));.  f
7790: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
77a0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
77b0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
77c0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
77d0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
77e0: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
77f0: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65  , pOp->p5,.#ifde
7800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7810: 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65       pOp->zComme
7820: 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  nt ? pOp->zComme
7830: 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20  nt : "".#else.  
7840: 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20      "".#endif.  
7850: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
7860: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
7870: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
7880: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
7890: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
78a0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
78b0: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
78c0: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
78d0: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
78e0: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  nd;.    sqlite3 
78f0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
7900: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65   u8 malloc_faile
7910: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
7920: 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62  iled;.    if( db
7930: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29  ->pnBytesFreed )
7940: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64  {.      for(pEnd
7950: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
7960: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  p++){.        sq
7970: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7980: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
7990: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
79a0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  n;.    }.    for
79b0: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
79c0: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
79d0: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29   assert( (&p[1])
79e0: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64  ==pEnd || p[0].d
79f0: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20  b==p[1].db );.. 
7a00: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
7a10: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
7a20: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
7a30: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
7a40: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
7a50: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
7a60: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
7a70: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
7a80: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
7a90: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
7aa0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
7ab0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
7ac0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
7ad0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
7ae0: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
7af0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
7b00: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
7b10: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
7b20: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
7b30: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
7b40: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
7b50: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
7b60: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
7b70: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
7b80: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
7b90: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
7ba0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
7bb0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
7bc0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
7bd0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
7be0: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
7bf0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
7c00: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
7c10: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
7c20: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
7c30: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
7c40: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
7c50: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
7c60: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
7c70: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
7c80: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
7c90: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
7ca0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
7cb0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
7cc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
7cd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
7ce0: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41   p->flags&(MEM_A
7cf0: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46  gg|MEM_Dyn|MEM_F
7d00: 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29  rame|MEM_RowSet)
7d10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7d20: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
7d30: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
7d40: 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e if( p->zMalloc
7d50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7d60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7d70: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
7d80: 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20     p->zMalloc = 
7d90: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
7da0: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
7db0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _Null;.    }.   
7dc0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7dd0: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
7de0: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
7df0: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
7e00: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
7e10: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
7e20: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
7e30: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
7e40: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
7e50: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
7e60: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
7e70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7e80: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
7e90: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
7ea0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
7eb0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
7ec0: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
7ed0: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
7ee0: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
7ef0: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
7f00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7f10: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
7f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
7f30: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
7f40: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
7f50: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7f60: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
7f70: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
7f80: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
7f90: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
7fa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7fb0: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
7fc0: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
7fd0: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
7fe0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
7ff0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
8000: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
8010: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
8020: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
8030: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
8040: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
8050: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
8060: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
8070: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
8080: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
8090: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
80a0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
80b0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
80c0: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
80d0: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
80e0: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
80f0: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
8100: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
8110: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
8120: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
8130: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
8140: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
8150: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
8160: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
8170: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
8180: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
8190: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
81a0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
81b0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
81c0: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
81d0: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
81e0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
81f0: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
8200: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
8210: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
8220: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
8230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8240: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
8250: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
8280: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
8290: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
82a0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
82d0: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
82e0: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
82f0: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
8300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8310: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
8320: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
8330: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8350: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
8360: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
8370: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
8380: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83a0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
83b0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
83c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
83f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
8400: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8420: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
8430: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
8440: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
8450: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8460: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
8470: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
8480: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
8490: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
84a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
84b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
84c0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
84d0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
84e0: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
84f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
8500: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
8510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
8520: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
8530: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
8540: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
8550: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
8560: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
8570: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
8580: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
8590: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
85a0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
85b0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
85c0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
85d0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
85e0: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
85f0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
8600: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
8610: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
8620: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
8630: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
8640: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
8650: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
8660: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
8670: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
8680: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
8690: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
86a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
86b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
86c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
86d0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
86e0: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
86f0: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
8700: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
8710: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
8720: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
8730: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
8740: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
8750: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
8760: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
8770: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
8780: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
8790: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
87a0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
87b0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
87c0: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
87d0: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
87e0: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
87f0: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
8800: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
8810: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
8820: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
8830: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
8840: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
8850: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
8860: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
8870: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
8880: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
8890: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
88a0: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
88b0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
88c0: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
88d0: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
88e0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
88f0: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
8900: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
8910: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
8920: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
8930: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
8940: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
8950: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
8960: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
8970: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
8980: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
8990: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
89a0: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
89b0: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
89c0: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
89d0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
89e0: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
89f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8a00: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
8a10: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
8a20: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
8a30: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8a40: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
8a50: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
8a60: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
8a70: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
8a80: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
8a90: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
8aa0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
8ab0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
8ac0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
8ad0: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
8ae0: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
8af0: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
8b00: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
8b10: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
8b20: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
8b30: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
8b40: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
8b50: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
8b60: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
8b70: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
8b80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8b90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
8ba0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
8bb0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
8bc0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
8bd0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
8be0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
8bf0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
8c00: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8c10: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
8c20: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
8c30: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
8c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
8c50: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  *z;.    Op *pOp;
8c60: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
8c70: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
8c80: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
8c90: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
8ca0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
8cb0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
8cc0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
8cd0: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
8ce0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
8cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d00: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
8d10: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
8d20: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
8d30: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
8d40: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
8d50: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
8d60: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
8d70: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8d80: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
8d90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
8da0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
8db0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8dc0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
8dd0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
8de0: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
8df0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
8e00: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8e10: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
8e20: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8e30: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
8e40: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8e50: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
8e60: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e90: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
8ea0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
8eb0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
8ec0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
8ed0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
8ee0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
8ef0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
8f00: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
8f10: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
8f20: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
8f30: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8f40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8f50: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8f60: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8f70: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8f80: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
8f90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8fa0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8fb0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
8fc0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
8fd0: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
8fe0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
8ff0: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
9000: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
9010: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
9020: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
9030: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
9040: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
9050: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
9060: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
9070: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
9080: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
9090: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
90a0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
90b0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
90c0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
90d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
90e0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
90f0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
9100: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
9110: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
9120: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
9130: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
9140: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
9150: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
9160: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
9170: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
9180: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
9190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
91a0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
91b0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
91c0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
91d0: 53 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29  Sub, nByte, 1) )
91e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  {.          apSu
91f0: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
9200: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
9210: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
9220: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
9230: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
9240: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d    pSub->flags |=
9250: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
9260: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
9270: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
9280: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
9290: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
92a0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
92b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
92c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
92d0: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
92f0: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
9300: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9310: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
9320: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
9330: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
9340: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
9350: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
9380: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9390: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
93a0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
93b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
93c0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
93d0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
9400: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
9410: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
9420: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
9430: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
9440: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
9450: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
9460: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
9470: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
9480: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9490: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
94a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
94b0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
94c0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
94d0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
94e0: 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34     z = displayP4
94f0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33  (pOp, pMem->z, 3
9500: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70  2);.    if( z!=p
9510: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
9520: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
9530: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31  tStr(pMem, z, -1
9540: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
9550: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9560: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
9570: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
9580: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
9590: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
95a0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
95b0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
95c0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
95d0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
95e0: 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b  _TEXT;.    pMem+
95f0: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
9600: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
9610: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
9620: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
9630: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
9640: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
9650: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9660: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9670: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
9680: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
9690: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
96a0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
96b0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
96c0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
96d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
96e0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
96f0: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
9700: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
9710: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9720: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
9730: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
9740: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
9750: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
9760: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
9770: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
9780: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  t ){.        pMe
9790: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
97a0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
97b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70       pMem->z = p
97c0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  Op->zComment;.  
97d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
97e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
97f0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
9800: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9810: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9820: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9830: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
9840: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
9850: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
9860: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9870: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9890: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
98a0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
98b0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
98c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
98d0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
98e0: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
98f0: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
9900: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
9910: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
9920: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9930: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
9940: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
9950: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
9960: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
9970: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
9980: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
9990: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
99a0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
99b0: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
99c0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
99d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
99e0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
99f0: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
9a00: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
9a10: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  Op;.  if( nOp<1 
9a20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
9a30: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
9a40: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
9a50: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
9a60: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
9a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
9a80: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
9a90: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
9aa0: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
9ab0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
9ac0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
9ad0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
9ae0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9af0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
9b00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9b10: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
9b20: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
9b30: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
9b40: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
9b50: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9b60: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
9b70: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
9b80: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
9b90: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
9ba0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
9bb0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
9bc0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
9bd0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
9be0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
9bf0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
9c00: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
9c10: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
9c20: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
9c30: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
9c40: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9c50: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
9c60: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
9c70: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
9c80: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
9c90: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
9ca0: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
9cb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9cc0: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
9cd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
9ce0: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
9cf0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
9d00: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
9d10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9d20: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
9d30: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
9d40: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
9d50: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
9d60: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
9d70: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9d80: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
9d90: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
9da0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
9db0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  /../*.** Allocat
9dc0: 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66  e space from a f
9dd0: 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72  ixed size buffer
9de0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
9df0: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
9e00: 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75   space.  If insu
9e10: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
9e20: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
9e30: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
9e40: 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74  The pBuf paramet
9e50: 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  er is the initia
9e60: 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69  l value of a poi
9e70: 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a  nter which will.
9e80: 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e  ** receive the n
9e90: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66  ew memory.  pBuf
9ea0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c   is normally NUL
9eb0: 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e  L.  If pBuf is n
9ec0: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d  ot.** NULL, it m
9ed0: 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79  eans that memory
9ee0: 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61   space has alrea
9ef0: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
9f00: 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68  d and that.** th
9f10: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
9f20: 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  d not allocate a
9f30: 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  ny new memory.  
9f40: 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74  When pBuf is not
9f50: 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20  .** NULL simply 
9f60: 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e  return pBuf.  On
9f70: 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20  ly allocate new 
9f80: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65  memory space whe
9f90: 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c  n pBuf.** is NUL
9fa0: 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69  L..**.** nByte i
9fb0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9fc0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e  bytes of space n
9fd0: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70  eeded..**.** *pp
9fe0: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61  From points to a
9ff0: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61  vailable space a
a000: 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74  nd pEnd points t
a010: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
a020: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70  .** available sp
a030: 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65  ace.  When space
a040: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a   is allocated, *
a050: 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63  ppFrom is advanc
a060: 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65  ed past.** the e
a070: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
a080: 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ted space..**.**
a090: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f   *pnByte is a co
a0a0: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
a0b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
a0c0: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
a0d0: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
a0e0: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
a0f0: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
a100: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f   space in *ppFro
a110: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  m to satisfy the
a120: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65  .** request, the
a130: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  n increment *pnB
a140: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  yte by the amoun
a150: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
a160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a170: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
a180: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
a190: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65       /* Where re
a1a0: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c  turn pointer wil
a1b0: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20  l be stored */. 
a1c0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
a1d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a1e0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
a1f0: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  cate */.  u8 **p
a200: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f  pFrom,         /
a210: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61  * IN/OUT: Alloca
a220: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20  te from *ppFrom 
a230: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20  */.  u8 *pEnd,  
a240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a250: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70  nter to 1 byte p
a260: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a  ast the end of *
a270: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f  ppFrom buffer */
a280: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20  .  int *pnByte  
a290: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
a2a0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  location cannot 
a2b0: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65  be made, increme
a2c0: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b  nt *pnByte */.){
a2d0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
a2e0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
a2f0: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  *ppFrom) );.  if
a300: 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20  ( pBuf ) return 
a310: 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20  pBuf;.  nByte = 
a320: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
a330: 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b   if( &(*ppFrom)[
a340: 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29  nByte] <= pEnd )
a350: 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f  {.    pBuf = (vo
a360: 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20  id*)*ppFrom;.   
a370: 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74   *ppFrom += nByt
a380: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
a390: 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65  *pnByte += nByte
a3a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
a3b0: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Buf;.}../*.** Re
a3c0: 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61  wind the VDBE ba
a3d0: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
a3e0: 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69  ing in preparati
a3f0: 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e  on for.** runnin
a400: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  g it..*/.void sq
a410: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
a420: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65  Vdbe *p){.#if de
a430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
a440: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
a450: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69  DBE_PROFILE).  i
a460: 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nt i;.#endif.  a
a470: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
a480: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
a490: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
a4a0: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
a4b0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
a4c0: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
a4d0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
a4e0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
a4f0: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
a500: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
a510: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
a520: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20  than later. */. 
a530: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
a540: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66  _MAGIC_RUN;..#if
a550: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a560: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d  .  for(i=1; i<p-
a570: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
a580: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
a590: 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  [i].db==p->db );
a5a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
a5b0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
a5c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a5d0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
a5e0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
a5f0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
a600: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
a610: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
a620: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
a630: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
a640: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
a650: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
a660: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
a670: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
a680: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
a690: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
a6a0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
a6b0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
a6c0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
a6d0: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
a6e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
a6f0: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
a700: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
a710: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
a720: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
a730: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
a740: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
a750: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
a760: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
a770: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
a780: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
a790: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
a7a0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
a7b0: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
a7c0: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
a7d0: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
a7e0: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
a7f0: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
a800: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
a810: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
a820: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
a830: 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20  lled exact once 
a840: 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61  on a each virtua
a850: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
a860: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
a870: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
a880: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
a890: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
a8a0: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
a8b0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
a8c0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74  e is called, fut
a8d0: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
a8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8f0: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
a900: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
a910: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
a920: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
a930: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
a940: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
a950: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
a960: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
a970: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
a980: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
a990: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
a9a0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
a9b0: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
a9c0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
a9d0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
a9e0: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
a9f0: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
aa00: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
aa10: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
aa20: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
aa30: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
aa40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
aa50: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
aa60: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa80: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
aa90: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aab0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
aac0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
aad0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
aae0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
aaf0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ab00: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
ab10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ab30: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
ab40: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ab70: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
ab80: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
ab90: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
aba0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
abb0: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
abc0: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
abd0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
abe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
abf0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
ac00: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
ac10: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ac40: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ter */.  u8 *zCs
ac50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
ac60: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
ac70: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
ac80: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
ac90: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20  u8 *zEnd;       
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
acb0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
acc0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  t allocated memo
acd0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ry */.  int nByt
ace0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
acf0: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
ad00: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  ch extra memory 
ad10: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  is needed */..  
ad20: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
ad30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
ad40: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
ad50: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
ad60: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
ad70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
ad80: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
ad90: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
ada0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
adb0: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
adc0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
add0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
ade0: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
adf0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
ae00: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
ae10: 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  Arg;.  .  /* For
ae20: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
ae30: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
ae40: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
ae50: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
ae60: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
ae70: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
ae80: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
ae90: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
aea0: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
aeb0: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
aec0: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
aed0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
aee0: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
aef0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
af00: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
af10: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
af20: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
af30: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
af40: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
af50: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
af60: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
af70: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
af80: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
af90: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
afa0: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
afb0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
afc0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
afd0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
afe0: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
aff0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
b000: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
b010: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
b020: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
b030: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
b040: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
b050: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
b060: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
b070: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
b080: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
b090: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
b0a0: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
b0b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
b0c0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
b0d0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a  ->nOpAlloc];  /*
b0e0: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
b0f0: 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a   end of zCsr[] *
b100: 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  /..  resolveP2Va
b110: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
b120: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
b130: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
b140: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
b150: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
b160: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
b170: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
b180: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
b190: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
b1a0: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
b1b0: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43  zEnd-zCsr);.  zC
b1c0: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75  sr += (zCsr - (u
b1d0: 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72  8*)0)&7;.  asser
b1e0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
b1f0: 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b  IGNMENT(zCsr) );
b200: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
b210: 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
b220: 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
b230: 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
b240: 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
b250: 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a  ated in two.  **
b260: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
b270: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
b280: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
b290: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
b2a0: 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68   .  ** end of th
b2b0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
b2c0: 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
b2d0: 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c  e to satisfy all
b2e0: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71   memory.  ** req
b2f0: 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75  uirements by reu
b300: 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20  sing the opcode 
b310: 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e  array tail, then
b320: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
b330: 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20   pass will fill 
b340: 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e  in the rest usin
b350: 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61  g a fresh alloca
b360: 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  tion.  .  **.  *
b370: 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
b380: 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
b390: 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
b3a0: 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
b3b0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65  from.  ** the le
b3c0: 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20  ftover space at 
b3d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
b3e0: 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20  pcode array can 
b3f0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
b400: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
b410: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
b420: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
b430: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
b440: 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79  /.  do {.    nBy
b450: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  te = 0;.    p->a
b460: 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
b470: 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73  (p->aMem, nMem*s
b480: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
b490: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b4a0: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
b4b0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
b4c0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
b4d0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
b4e0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b4f0: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
b500: 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20  Space(p->apArg, 
b510: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
b520: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b530: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b540: 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  azVar = allocSpa
b550: 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61  ce(p->azVar, nVa
b560: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c  r*sizeof(char*),
b570: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b580: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Byte);.    p->ap
b590: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
b5a0: 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73  (p->apCsr, nCurs
b5b0: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
b5c0: 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20  rsor*),.        
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26    &zCsr, zEnd, &
b5f0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
b600: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70  nByte ){.      p
b610: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
b620: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
b630: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
b640: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
b650: 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ree;.    zEnd = 
b660: 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20  &zCsr[nByte];.  
b670: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26  }while( nByte &&
b680: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
b690: 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72  ed );..  p->nCur
b6a0: 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75 72 73  sor = (u16)nCurs
b6b0: 6f 72 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  or;.  if( p->aVa
b6c0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
b6d0: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
b6e0: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
b6f0: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
b700: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
b710: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
b720: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
b730: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
b740: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72  }.  if( p->azVar
b750: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
b760: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
b770: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
b780: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
b790: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
b7a0: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
b7b0: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
b7c0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
b7d0: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
b7e0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
b7f0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
b800: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
b810: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
b840: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
b850: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
b860: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
b870: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
b880: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
b890: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
b8a0: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
b8b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
b8c0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
b8d0: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ull;.      p->aM
b8e0: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
b8f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78     }.  }.  p->ex
b900: 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
b910: 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74  explain;.  sqlit
b920: 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
b930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
b940: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
b950: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
b960: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
b970: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
b980: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
b990: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b9a0: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
b9b0: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
b9c0: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
b9d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
b9e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
b9f0: 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70  dbeSorterClose(p
ba00: 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66  ->db, pCx);.  if
ba10: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
ba20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
ba30: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
ba40: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
ba50: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
ba60: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
ba70: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
ba80: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
ba90: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
baa0: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
bab0: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
bac0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
bad0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
bae0: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
baf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
bb00: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
bb10: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
bb20: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
bb30: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
bb40: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
bb50: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
bb60: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
bb70: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
bb80: 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  = pCx->pModule;.
bb90: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
bba0: 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f  hod = 1;.    pMo
bbb0: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
bbc0: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  abCursor);.    p
bbd0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
bbe0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
bbf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
bc00: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
bc10: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
bc20: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
bc30: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
bc40: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
bc50: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
bc60: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
bc70: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
bc80: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
bc90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
bca0: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
bcb0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
bcc0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
bcd0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
bce0: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
bcf0: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
bd00: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
bd10: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
bd20: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
bd30: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
bd40: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
bd50: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
bd60: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
bd70: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
bd80: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
bd90: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
bda0: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
bdb0: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
bdc0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
bdd0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
bde0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
bdf0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
be00: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
be10: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
be20: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
be30: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
be40: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
be50: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
be60: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
be70: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
be80: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
be90: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
bea0: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
beb0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
bec0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
bed0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
bee0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
bef0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
bf00: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
bf10: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
bf20: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
bf30: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
bf40: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
bf50: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
bf60: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
bf70: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
bf80: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
bf90: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
bfa0: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
bfb0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
bfc0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
bfd0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
bfe0: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
bff0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
c000: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
c010: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
c020: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
c030: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
c040: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
c050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
c060: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
c070: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
c080: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
c090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c0a0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
c0b0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c0c0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
c0d0: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
c0e0: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
c0f0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
c100: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
c110: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
c120: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
c130: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
c140: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
c150: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
c160: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
c170: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
c180: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
c190: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c1a0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
c1b0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
c1c0: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
c1d0: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
c1e0: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
c1f0: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
c200: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
c210: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
c220: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
c230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c240: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
c250: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c260: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
c270: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
c280: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
c290: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
c2a0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
c2b0: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
c2c0: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
c2d0: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
c2e0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
c2f0: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
c300: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c310: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
c320: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
c330: 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e  >apCsr==0 || p->
c340: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
c350: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
c360: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
c370: 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c  t( p->aMem==0 ||
c380: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
c390: 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23  s==MEM_Null );.#
c3a0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
c3b0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
c3c0: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
c3d0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
c3e0: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
c3f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c400: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
c410: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
c420: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
c430: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
c440: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
c450: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
c460: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
c470: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
c480: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
c490: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
c4a0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
c4b0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
c4c0: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
c4d0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
c4e0: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
c4f0: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
c500: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
c510: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
c520: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
c530: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
c540: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
c550: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c560: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
c570: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
c580: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
c590: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
c5a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c5b0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
c5c0: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
c5d0: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
c5e0: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
c5f0: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
c600: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
c610: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
c620: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c630: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
c640: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
c650: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
c660: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
c670: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
c680: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
c690: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
c6a0: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
c6b0: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
c6c0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
c6d0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
c6e0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
c6f0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
c700: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
c710: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
c720: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
c730: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
c740: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
c750: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
c760: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
c770: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
c780: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c790: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
c7a0: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
c7b0: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
c7c0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
c7d0: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
c7e0: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
c7f0: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
c800: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
c810: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
c820: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
c830: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
c840: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
c850: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
c860: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
c870: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
c880: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
c890: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
c8c0: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
c8d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c900: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
c910: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
c920: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c950: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
c960: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
c970: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
c980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
c990: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
c9a0: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
c9b0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
c9c0: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
c9d0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
c9e0: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
c9f0: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
ca00: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
ca10: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
ca20: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
ca30: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
ca40: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
ca50: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
ca60: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ca70: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
ca80: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
ca90: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
caa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
cab0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
cac0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
cad0: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
cae0: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
caf0: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
cb00: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
cb10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
cb20: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
cb30: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
cb40: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
cb50: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
cb60: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
cb70: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
cb80: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
cb90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
cba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
cbb0: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
cbc0: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
cbd0: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
cbe0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
cbf0: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
cc00: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
cc10: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
cc20: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
cc30: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
cc40: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
cc50: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
cc60: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
cc70: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
cc80: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
cc90: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
cca0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
ccb0: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
ccc0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
ccd0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
cce0: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
ccf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
cd00: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
cd10: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
cd20: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
cd30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cd40: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
cd50: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
cd60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
cd70: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
cd80: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
cd90: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
cda0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
cdb0: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
cdc0: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
cdd0: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
cde0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
cdf0: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
ce00: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
ce10: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
ce20: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
ce30: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
ce40: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
ce50: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
ce60: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
ce70: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
ce80: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
ce90: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
cea0: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
ceb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cec0: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
ced0: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
cee0: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
cef0: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
cf00: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
cf10: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
cf20: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
cf30: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
cf40: 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  (db, &p->zErrMsg
cf50: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
cf60: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
cf70: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
cf80: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
cf90: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
cfa0: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
cfb0: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
cfc0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
cfd0: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
cfe0: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
cff0: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
d000: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
d010: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
d020: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
d030: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
d040: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
d050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
d060: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
d070: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
d080: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
d090: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
d0a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
d0b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d0c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
d0d0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d0e0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d0f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
d100: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
d110: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
d120: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
d130: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
d140: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63  rans++;.      rc
d150: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
d160: 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c  xclusiveLock(sql
d170: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
d180: 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Bt));.    }.  }.
d190: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d1a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
d1b0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
d1c0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
d1d0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
d1e0: 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
d1f0: 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
d200: 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
d210: 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
d220: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
d230: 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
d240: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
d250: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
d260: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d270: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d280: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
d290: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d2a0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
d2b0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
d2c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
d2d0: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
d2e0: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
d2f0: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
d300: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
d310: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
d320: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
d330: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
d340: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
d350: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
d360: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
d370: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
d380: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
d390: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
d3a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
d3b0: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
d3c0: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
d3d0: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
d3e0: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
d3f0: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
d400: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
d410: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
d420: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
d430: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
d440: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
d450: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
d460: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
d470: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
d480: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
d490: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
d4a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d4b0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
d4c0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
d4d0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d4e0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
d4f0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
d500: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d510: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
d520: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
d530: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
d540: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
d550: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
d560: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
d570: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
d580: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
d590: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
d5a0: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
d5b0: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
d5c0: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
d5d0: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
d5e0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
d5f0: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
d600: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
d610: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
d620: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
d630: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
d640: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
d650: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
d660: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
d670: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d680: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d690: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d6a0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d6b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d6c0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
d6d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d6e0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d6f0: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
d700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d710: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d720: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
d730: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
d740: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
d750: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
d760: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
d770: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
d780: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d790: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
d7a0: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
d7b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d7c0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
d7d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
d7e0: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
d7f0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
d800: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d810: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
d820: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
d830: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
d840: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
d850: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
d860: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
d870: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
d880: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
d890: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
d8a0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
d8b0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
d8c0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
d8d0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
d8e0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
d8f0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
d900: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d910: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20      int res;..  
d920: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
d930: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d940: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f  e name */.    do
d950: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
d960: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  ndom;.      sqli
d970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
d980: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
d990: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
d9a0: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
d9b0: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
d9c0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
d9d0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d9e0: 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61  "%s-mj%08X", zMa
d9f0: 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26  inFile, iRandom&
da00: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0x7fffffff);.   
da10: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
da20: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
da30: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
da40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
da50: 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
da60: 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
da70: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
da80: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
da90: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
daa0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
dab0: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
dac0: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
dad0: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
dae0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
daf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
db00: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
db10: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
db20: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
db30: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
db40: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
db50: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
db60: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
db70: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
db80: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
db90: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
dba0: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
dbb0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
dbc0: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
dbd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
dbe0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dbf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
dc00: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
dc10: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
dc20: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
dc30: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
dc40: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
dc50: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
dc60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
dc70: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
dc80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
dc90: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
dca0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
dcb0: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
dcc0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
dcd0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
dce0: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
dcf0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
dd00: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
dd10: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
dd20: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
dd30: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
dd40: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
dd50: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
dd60: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
dd70: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
dd80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
dd90: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
dda0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
ddb0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ddc0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ddd0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
dde0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
ddf0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
de00: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
de10: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
de20: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
de30: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
de40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
de50: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
de60: 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
de70: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
de80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
de90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
dea0: 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
deb0: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
dec0: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
ded0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
dee0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
def0: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
df00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
df20: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
df30: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
df40: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
df50: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
df60: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
df70: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
df80: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
df90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dfa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
dfb0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
dfc0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
dfd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
dfe0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
dff0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
e000: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e010: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e020: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e030: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e040: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e050: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
e060: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e070: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
e080: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
e090: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
e0a0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
e0b0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
e0c0: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
e0d0: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
e0e0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
e0f0: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
e100: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
e110: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
e120: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
e130: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
e140: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
e150: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
e160: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
e170: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
e180: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
e190: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
e1a0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
e1b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e1c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
e1d0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
e1e0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
e1f0: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
e200: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
e210: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
e220: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
e230: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
e240: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
e250: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
e260: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
e270: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
e280: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
e290: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
e2a0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
e2b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e2c0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
e2d0: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
e2e0: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
e2f0: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
e300: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
e310: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
e320: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
e330: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
e340: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
e350: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
e360: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
e370: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
e380: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
e390: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
e3a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
e3b0: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
e3c0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
e3d0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
e3e0: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
e3f0: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
e400: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
e410: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e420: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e430: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
e440: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e450: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
e460: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e470: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
e480: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
e490: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
e4a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e4b0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
e4c0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
e4d0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e4e0: 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
e4f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e500: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
e510: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e520: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
e530: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
e540: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
e550: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e560: 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
e570: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
e580: 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
e590: 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
e5a0: 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
e5b0: 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
e5c0: 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
e5d0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
e5e0: 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
e5f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
e600: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
e610: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
e620: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
e630: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e640: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
e650: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
e660: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
e670: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
e680: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
e690: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
e6a0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
e6b0: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
e6c0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
e6d0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
e6e0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e6f0: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
e700: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
e710: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
e720: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
e730: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
e740: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
e750: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
e760: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
e770: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
e780: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
e790: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
e7a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
e7b0: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
e7c0: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
e7d0: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
e7e0: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
e7f0: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
e800: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
e810: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
e820: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
e830: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
e840: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
e850: 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
e860: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
e870: 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
e880: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
e890: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
e8a0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e8b0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e8c0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
e8d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
e8e0: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
e8f0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
e900: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
e910: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
e920: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
e930: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
e940: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
e950: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
e960: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
e970: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
e980: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
e990: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
e9a0: 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62  qlite3.activeVdb
e9b0: 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61  eCnt count varia
e9c0: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
e9d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
e9e0: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
e9f0: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
ea00: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
ea10: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
ea20: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
ea30: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
ea40: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
ea50: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
ea60: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
ea70: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
ea80: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
ea90: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
eaa0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
eab0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
eac0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
ead0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
eae0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
eaf0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
eb00: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
eb10: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
eb20: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
eb30: 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rite = 0;.  p = 
eb40: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
eb50: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
eb60: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
eb70: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
eb80: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  pc>=0 ){.      c
eb90: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
eba0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
ebb0: 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d   nWrite++;.    }
ebc0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
ebd0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
ebe0: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
ebf0: 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73  VdbeCnt );.  ass
ec00: 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
ec10: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
ec20: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
ec30: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
ec40: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
ec50: 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42  *.** For every B
ec60: 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74  tree that in dat
ec70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ec80: 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61   db which .** ha
ec90: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c  s been modified,
eca0: 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c   "trip" or inval
ecb0: 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f  idate each curso
ecc0: 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72  r in.** that Btr
ecd0: 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ee might have be
ece0: 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74  en modified so t
ecf0: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
ed00: 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75  * can never be u
ed10: 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73  sed again.  This
ed20: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20   happens when a 
ed30: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63  rollback.*** occ
ed40: 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  urs.  We have to
ed50: 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74   trip all the ot
ed60: 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65  her cursors, eve
ed70: 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d  n.** cursor from
ed80: 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69   other VMs in di
ed90: 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65  fferent database
eda0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a   connections,.**
edb0: 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66   so that none of
edc0: 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65   them try to use
edd0: 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69   the data at whi
ede0: 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20  ch they.** were 
edf0: 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69  pointing and whi
ee00: 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20  ch now may have 
ee10: 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65  been changed due
ee20: 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62  .** to the rollb
ee30: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d  ack..**.** Remem
ee40: 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62  ber that a rollb
ee50: 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74  ack can delete t
ee60: 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61  ables complete a
ee70: 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f  nd.** reorder ro
ee80: 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20  otpages.  So it 
ee90: 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
eea0: 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a  t just to save.*
eeb0: 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  * the state of t
eec0: 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68  he cursor.  We h
eed0: 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  ave to invalidat
eee0: 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  e the cursor.** 
eef0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65  so that it is ne
ef00: 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a  ver used again..
ef10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
ef20: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
ef30: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
ef40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
ef50: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
ef60: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
ef70: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
ef80: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
ef90: 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20  t;.    if( p && 
efa0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
efb0: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
efc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
efd0: 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
efe0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20  SQLITE_ABORT);. 
eff0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f000: 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61  * If the Vdbe pa
f010: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
f020: 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65  t argument opene
f030: 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  d a statement-tr
f040: 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c  ansaction,.** cl
f050: 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75  ose it now. Argu
f060: 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65  ment eOp must be
f070: 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
f080: 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a  T_ROLLBACK or.**
f090: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f0a0: 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  SE. If it is SAV
f0b0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
f0c0: 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d   then the statem
f0d0: 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
f0e0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
f0f0: 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56  k. If eOp is SAV
f100: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
f110: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61  then the .** sta
f120: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f130: 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a  on is commtted..
f140: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
f150: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
f160: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
f170: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
f180: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
f190: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
f1a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f1b0: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
f1c0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
f1d0: 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
f1e0: 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
f1f0: 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
f200: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
f210: 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
f220: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
f230: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
f240: 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
f250: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
f260: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
f270: 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
f280: 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
f290: 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
f2a0: 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
f2b0: 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
f2c0: 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
f2d0: 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
f2e0: 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
f2f0: 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
f300: 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
f310: 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
f320: 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
f330: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
f340: 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
f350: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
f360: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
f370: 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
f380: 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
f390: 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
f3a0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f3b0: 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
f3c0: 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
f3d0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
f3e0: 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
f3f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
f400: 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
f410: 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
f420: 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
f430: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
f440: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
f450: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
f460: 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
f470: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
f480: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
f490: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
f4a0: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f4b0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f4c0: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
f4d0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
f4e0: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
f4f0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
f500: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
f510: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f520: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
f530: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f540: 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
f550: 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
f560: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f570: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
f580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f590: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f5a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f5b0: 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
f5c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f5d0: 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
f5e0: 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
f5f0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
f600: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f610: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
f620: 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
f630: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
f640: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f650: 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
f660: 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
f670: 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
f680: 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
f690: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f6a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f6b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
f6c0: 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
f6d0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
f6e0: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
f6f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f700: 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
f710: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
f720: 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
f730: 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
f740: 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
f750: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
f760: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
f770: 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
f780: 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
f790: 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
f7a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
f7b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
f7c0: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
f7d0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f7e0: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
f7f0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
f800: 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
f810: 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cons;.    }.  }.
f820: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f830: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f840: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
f850: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
f860: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
f870: 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
f880: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
f890: 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
f8a0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
f8b0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
f8c0: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
f8d0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
f8e0: 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
f8f0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
f900: 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
f910: 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
f920: 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
f930: 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
f940: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
f950: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
f960: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
f970: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
f980: 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
f990: 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
f9a0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
f9b0: 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
f9c0: 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74  STRAINT and writ
f9d0: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65  e.** an error me
f9e0: 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
f9f0: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
fa00: 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
fa10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
fa20: 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
fa30: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
fa40: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
fa50: 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
fa60: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
fa70: 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
fa80: 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
fa90: 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66  Cons>0) || (!def
faa0: 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
fab0: 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a  onstraint>0) ){.
fac0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
fad0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
fae0: 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
faf0: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
fb00: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
fb10: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
fb20: 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  db, "foreign key
fb30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
fb40: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
fb50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
fb60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
fb70: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
fb80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fb90: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
fba0: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
fbb0: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
fbc0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
fbd0: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
fbe0: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
fbf0: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
fc00: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
fc10: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
fc20: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
fc30: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
fc40: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
fc50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
fc60: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
fc70: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
fc80: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
fc90: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
fca0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
fcb0: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
fcc0: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
fcd0: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
fce0: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
fcf0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
fd00: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
fd10: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
fd20: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
fd30: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
fd40: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
fd50: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
fd60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
fd70: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
fd80: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
fd90: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
fda0: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
fdb0: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
fdc0: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
fdd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
fde0: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
fdf0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
fe20: 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
fe30: 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
fe40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
fe50: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
fe60: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
fe70: 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
fe80: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
fe90: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
fea0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
feb0: 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
fec0: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
fed0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
fee0: 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
fef0: 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
ff00: 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
ff10: 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
ff20: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
ff30: 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
ff40: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
ff50: 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
ff60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
ff70: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
ff80: 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
ff90: 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
ffa0: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
ffb0: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
ffc0: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
ffd0: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
ffe0: 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
fff0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
10000 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
10010 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10020 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
10030 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
10040 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
10050 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
10060 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
10070 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
10080 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
10090 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
100a0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
100b0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f  NOMEM;.  }.  clo
100c0 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
100d0 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
100e0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
100f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10100 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
10110 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
10120 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
10130 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
10140 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
10150 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
10160 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
10170 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
10180 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
10190 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
101a0 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
101b0 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
101c0 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
101d0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
101e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
101f0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
10200 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
10210 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
10220 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
10230 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
10240 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10250 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
10260 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
10270 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
10280 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
10290 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
102a0 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ff;.    assert( 
102b0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  p->rc!=SQLITE_IO
102c0 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20  ERR_BLOCKED );  
102d0 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f  /* This error no
102e0 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a   longer exists *
102f0 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  /.    isSpecialE
10300 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
10310 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
10320 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
10350 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
10360 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
10370 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
10380 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
10390 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
103a0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
103b0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
103c0 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
103d0 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
103e0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
103f0 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
10400 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
10410 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
10420 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10430 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
10440 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
10450 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
10460 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
10470 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
10480 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10490 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
104a0 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
104b0 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
104c0 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
104d0 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
104e0 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
104f0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
10500 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
10510 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
10520 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  cured while writ
10530 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
10540 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
10550 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
10560 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
10570 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
10580 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
10590 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
105a0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
105b0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
105c0 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
105d0 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
105e0 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
105f0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
10600 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
10610 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
10620 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
10630 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
10640 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
10650 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
10660 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
10670 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
10680 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
10690 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
106a0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
106b0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
106c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
106d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
106e0 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
106f0 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
10700 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
10710 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
10720 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
10730 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
10740 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
10750 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
10760 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
10770 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
10780 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
10790 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
107a0 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
107b0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
107c0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
107d0 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
107e0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
107f0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
10800 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
10810 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
10820 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10830 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
10840 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
10850 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
10860 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
10870 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
10890 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
108a0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
108b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
108c0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
108d0 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
108e0 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
108f0 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
10900 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
10910 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
10920 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
10930 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
10940 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
10950 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
10960 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
10970 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
10980 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
10990 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
109a0 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
109b0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
109c0 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
109d0 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
109e0 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
109f0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72   .     && db->wr
10a00 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e  iteVdbeCnt==(p->
10a10 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
10a20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
10a30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10a40 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
10a50 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
10a60 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
10a70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10a80 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
10a90 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
10aa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
10ac0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
10ad0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
10ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10af0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
10b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10b10 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
10b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10b30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10b40 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
10b50 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20     }else{ .     
10b60 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
10b70 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
10b80 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70  true, the vdbe p
10b90 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65  rogram was succe
10ba0 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20  ssful .         
10bb0 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f   ** or hit an 'O
10bc0 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
10bd0 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  nt and there are
10be0 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72   no deferred for
10bf0 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  eign.          *
10c00 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  * key constraint
10c10 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65  s to hold up the
10c20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
10c30 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
10c40 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
10c50 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
10c60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
10c70 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29  dbeCommit(db, p)
10c80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10c90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10ca0 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65  TE_BUSY && p->re
10cb0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
10cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
10cd0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
10ce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10cf0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
10d00 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
10d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10d20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
10d30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10d40 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
10d50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10d60 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
10d70 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
10d80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10d90 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
10da0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
10db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10dc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10dd0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10de0 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
10df0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
10e00 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
10e10 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
10e20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
10e30 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10e40 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
10e50 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
10e60 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
10e70 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
10e80 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
10e90 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
10ea0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
10eb0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
10ec0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
10ed0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10ee0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10ef0 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
10f00 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
10f10 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
10f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10f30 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
10f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
10f50 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
10f60 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
10f70 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
10f80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
10f90 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
10fa0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
10fb0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
10fc0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
10fd0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
10fe0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
10ff0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
11000 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
11010 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
11020 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
11030 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
11040 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
11050 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
11060 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
11070 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
11080 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
11090 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
110a0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
110b0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
110c0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
110d0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
110e0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
110f0 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
11100 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
11110 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
11120 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
11130 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
11140 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
11150 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
11160 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  >rc==SQLITE_CONS
11170 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
11180 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
11190 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
111a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
111b0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
111c0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
111d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
111e0 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
111f0 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
11200 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
11210 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
11220 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
11230 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
11240 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
11250 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
11260 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
11270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
11280 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
11290 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
112a0 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
112b0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
112c0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
112d0 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
112e0 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
112f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11300 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
11310 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
11320 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
11330 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
11340 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
11350 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
11360 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
11370 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
11380 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
11390 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
113a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
113b0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
113c0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
113d0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
113e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
113f0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72    /* Rollback or
11400 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65   commit any sche
11410 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ma changes that 
11420 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20  occurred. */.   
11430 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
11440 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61  TE_OK && db->fla
11450 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
11460 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20  Changes ){.     
11470 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
11480 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
11490 2d 31 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66  -1);.      db->f
114a0 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  lags = (db->flag
114b0 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s | SQLITE_Inter
114c0 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d  nChanges);.    }
114d0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
114e0 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
114f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
11500 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
11510 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
11520 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
11530 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
11540 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
11550 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
11560 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
11570 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b  activeVdbeCnt--;
11580 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
11590 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64  dOnly ){.      d
115a0 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d  b->writeVdbeCnt-
115b0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  -;.    }.    ass
115c0 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56  ert( db->activeV
115d0 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74  dbeCnt>=db->writ
115e0 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a  eVdbeCnt );.  }.
115f0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
11600 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
11610 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
11620 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
11630 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
11640 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
11650 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11660 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
11670 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
11680 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
11690 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
116a0 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
116b0 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
116c0 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
116d0 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
116e0 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
116f0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
11700 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
11710 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
11720 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
11730 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
11740 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
11750 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
11760 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
11770 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
11780 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
11790 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  eCnt>0 || db->au
117a0 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
117b0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
117c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
117d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
117e0 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
117f0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
11800 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
11810 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
11820 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
11830 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
11840 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
11850 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
11860 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
11870 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
11880 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
11890 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
118a0 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
118b0 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
118c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
118d0 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f  ** Copy the erro
118e0 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
118f0 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69   message belongi
11900 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70  ng to the VDBE p
11910 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
11920 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
11930 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68  o its database h
11940 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74  andle (so that t
11950 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  hey will be .** 
11960 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c  returned by call
11970 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72  s to sqlite3_err
11980 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74  code() and sqlit
11990 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a  e3_errmsg())..**
119a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
119b0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72  n does not clear
119c0 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20   the VDBE error 
119d0 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c  code or message,
119e0 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20   just.** copies 
119f0 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61  them to the data
11a00 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
11a10 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54  int sqlite3VdbeT
11a20 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62  ransferError(Vdb
11a30 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
11a40 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
11a50 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
11a60 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
11a70 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f   ){.    u8 mallo
11a80 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  cFailed = db->ma
11a90 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
11aa0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
11ab0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
11ac0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
11ad0 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
11ae0 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
11af0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
11b00 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
11b10 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11b20 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64  nMalloc();.    d
11b30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11b40 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  = mallocFailed;.
11b50 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
11b60 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = rc;.  }else{. 
11b70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
11b80 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a  db, rc, 0);.  }.
11b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11ba0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
11bb0 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
11bc0 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
11bd0 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
11be0 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
11bf0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
11c00 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
11c10 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
11c20 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
11c30 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
11c40 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
11c50 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
11c60 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
11c70 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
11c80 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
11c90 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
11ca0 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
11cb0 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
11cc0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
11cd0 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
11ce0 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
11cf0 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
11d00 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
11d10 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
11d20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
11d30 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
11d40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
11d50 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
11d60 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
11d70 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
11d80 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
11d90 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
11da0 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
11db0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
11dc0 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
11dd0 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
11de0 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
11df0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
11e00 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
11e10 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
11e20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
11e30 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
11e40 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
11e50 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
11e60 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
11e70 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
11e80 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11e90 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
11ea0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
11eb0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
11ec0 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
11ed0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
11ee0 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
11ef0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
11f00 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
11f10 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
11f20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
11f30 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
11f40 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
11f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
11f60 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a  ansferError(p);.
11f70 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11f80 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
11f90 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
11fa0 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  g = 0;.    if( p
11fb0 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20  ->runOnlyOnce ) 
11fc0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
11fd0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
11fe0 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
11ff0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
12000 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
12010 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
12020 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
12030 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
12040 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
12050 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
12060 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
12070 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
12080 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
12090 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
120a0 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
120b0 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
120c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
120d0 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
120e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
120f0 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
12100 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
12110 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
12120 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
12130 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12140 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
12150 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
12160 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
12170 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
12180 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
12190 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
121a0 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65  p(p);..  /* Save
121b0 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72   profiling infor
121c0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73  mation from this
121d0 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a   VDBE run..  */.
121e0 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
121f0 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
12200 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
12210 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
12220 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
12230 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
12240 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
12250 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
12260 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12270 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
12280 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
12290 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
122a0 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
122b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
122c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
122d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
122e0 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
122f0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
12300 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c  (out, "%6d %10ll
12310 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20  d %8lld ",.     
12320 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
12330 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
12340 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
12350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
12360 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
12370 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
12380 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
12390 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
123a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
123b0 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
123c0 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
123d0 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
123e0 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
123f0 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61  }.#endif.  p->ma
12400 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
12410 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
12420 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
12430 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
12440 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
12450 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
12460 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
12470 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
12480 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
12490 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
124a0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
124b0 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
124c0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
124d0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
124e0 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
124f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12500 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
12510 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
12520 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
12530 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
12540 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
12550 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
12560 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
12570 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
12580 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
12590 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
125a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
125b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
125c0 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
125d0 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
125e0 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
125f0 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
12600 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
12610 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
12620 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
12630 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
12640 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
12650 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
12660 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
12670 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
12680 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
12690 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
126a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
126b0 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
126c0 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
126d0 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
126e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
126f0 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
12700 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
12710 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
12720 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
12730 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
12740 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
12750 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31   !(mask&(((u32)1
12760 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d  )<<i))) && pAux-
12770 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69  >pAux ){.      i
12780 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
12790 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
127a0 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
127b0 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
127c0 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20       pAux->pAux 
127d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
127e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
127f0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
12800 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
12810 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
12820 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
12830 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
12840 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
12850 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69  unction and sqli
12860 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20  te3VdbeDelete() 
12870 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44  is that.** VdbeD
12880 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c  elete() also unl
12890 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72  inks the Vdbe fr
128a0 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56  om the list of V
128b0 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Ms associated wi
128c0 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  th.** the databa
128d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
128e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
128f0 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 73  beDeleteObject(s
12900 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
12910 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
12920 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
12930 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
12940 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
12950 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
12960 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
12970 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
12980 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
12990 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
129a0 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
129b0 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
129c0 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
129d0 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
129e0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
129f0 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
12a00 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
12a10 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
12a20 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
12a30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12a40 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
12a50 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
12a60 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
12a70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12a80 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
12a90 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
12aa0 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
12ab0 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
12ac0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
12ad0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  bel);.  sqlite3D
12ae0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
12af0 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
12b00 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
12b10 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
12b20 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
12b30 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ee);.  sqlite3Db
12b40 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
12b50 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
12b60 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
12b70 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
12b80 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
12b90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
12ba0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
12bb0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
12bc0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
12bd0 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
12be0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
12bf0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12c00 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
12c10 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
12c20 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
12c30 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
12c40 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
12c50 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
12c60 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
12c70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
12c80 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
12c90 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b  AD;.  p->db = 0;
12ca0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
12cb0 6c 65 74 65 4f 62 6a 65 63 74 28 64 62 2c 20 70  leteObject(db, p
12cc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
12cd0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
12ce0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
12cf0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
12d00 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
12d10 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
12d20 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
12d30 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
12d40 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
12d50 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
12d60 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
12d70 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
12d80 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
12d90 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
12da0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
12db0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
12dc0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
12dd0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
12de0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
12df0 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
12e00 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
12e10 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
12e20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
12e30 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
12e40 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
12e50 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
12e60 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
12e70 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
12e80 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
12e90 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
12ea0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
12eb0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
12ec0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
12ed0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
12ee0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
12ef0 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
12f00 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
12f10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12f20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
12f30 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
12f40 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
12f50 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
12f60 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
12f70 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
12f80 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
12f90 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
12fa0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
12fb0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
12fc0 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
12fd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12fe0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
12ff0 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
13000 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
13010 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
13020 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13030 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61  rn rc;.    p->la
13040 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76  stRowid = p->mov
13050 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69  etoTarget;.    i
13060 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
13070 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
13080 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72  T_BKPT;.    p->r
13090 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b  owidIsValid = 1;
130a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
130b0 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
130c0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
130d0 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
130e0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
130f0 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
13100 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
13110 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
13120 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f  ALWAYS(p->pCurso
13130 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  r) ){.    int ha
13140 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
13150 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
13160 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
13170 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
13180 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
13190 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
131a0 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
131b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
131c0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
131d0 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
131e0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
131f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13210 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
13220 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
13230 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
13240 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
13250 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13260 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
13270 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
13280 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
13290 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
132a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
132b0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
132c0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
132d0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
132e0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
132f0 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
13300 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
13310 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
13320 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
13330 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
13340 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
13350 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
13360 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
13370 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
13380 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
13390 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
133a0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
133b0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
133c0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
133d0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
133e0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
133f0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
13400 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
13410 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
13420 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
13430 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
13440 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
13450 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
13460 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
13470 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
13480 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
13490 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
134a0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
134b0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
134c0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
134d0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
134e0 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
134f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
13500 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
13510 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
13520 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
13530 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
13540 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
13550 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
13560 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
13570 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
13580 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
13590 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
135b0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
135c0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
135d0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
135e0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
135f0 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
13600 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13610 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13630 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
13640 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13650 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
13660 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
13670 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13680 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13690 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
136a0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
136b0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
136c0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
136f0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13700 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
13710 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
13720 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13730 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13760 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
13770 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13780 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
13790 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
137a0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
137b0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
137c0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
137d0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
137e0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
137f0 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
13820 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
13830 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
13840 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
13850 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
13860 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
13870 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
13880 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
13890 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
138a0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
138b0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
138c0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
138d0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
138e0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
138f0 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
13900 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
13910 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13920 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
13930 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
13940 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
13950 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13960 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
13970 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
13980 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
13990 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
139a0 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
139b0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
139c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
139d0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
139e0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
139f0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
13a00 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
13a10 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
13a20 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
13a30 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
13a40 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
13a50 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
13a60 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
13a70 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
13a80 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26  file_format>=4 &
13a90 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20  & (i&1)==i ){.  
13aa0 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33      return 8+(u3
13ab0 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  2)i;.    }.    i
13ac0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
13ad0 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54  if( i<(-MAX_6BYT
13ae0 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20  E) ) return 6;. 
13af0 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
13b00 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20   test prevents: 
13b10 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30   u = -(-92233720
13b20 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a  36854775808) */.
13b30 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20        u = -i;.  
13b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
13b50 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
13b60 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74  if( u<=127 ) ret
13b70 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75  urn 1;.    if( u
13b80 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
13b90 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
13ba0 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
13bb0 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
13bc0 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
13bd0 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
13be0 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
13bf0 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
13c00 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
13c10 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
13c20 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
13c30 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
13c40 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
13c50 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
13c60 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
13c70 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
13c80 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
13c90 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
13ca0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
13cb0 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
13cc0 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
13cd0 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
13ce0 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
13cf0 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
13d00 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
13d10 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
13d20 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
13d30 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
13d40 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
13d50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13d60 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
13d70 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
13d80 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
13d90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
13da0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
13db0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
13dc0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
13dd0 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
13de0 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
13df0 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
13e00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
13e10 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
13e20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
13e30 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
13e40 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
13e50 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
13e60 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
13e70 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
13e80 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
13e90 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
13ea0 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
13eb0 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
13ec0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
13ed0 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
13ee0 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
13ef0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
13f00 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
13f10 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
13f20 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
13f30 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
13f40 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
13f50 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
13f60 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
13f70 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
13f80 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
13f90 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
13fa0 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
13fb0 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
13fc0 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
13fd0 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
13fe0 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
13ff0 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
14000 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
14010 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
14020 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
14030 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
14040 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
14050 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
14060 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
14070 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
14080 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
14090 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
140a0 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
140b0 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
140c0 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
140d0 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
140e0 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
140f0 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
14100 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
14110 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
14120 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
14130 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
14140 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
14150 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
14160 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
14170 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
14180 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
14190 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
141a0 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
141b0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
141c0 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
141d0 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
141e0 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
141f0 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
14200 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
14210 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
14220 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
14230 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
14240 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
14250 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
14260 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
14270 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
14280 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
14290 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
142a0 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
142b0 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
142c0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
142d0 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
142e0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
142f0 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
14300 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
14310 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
14320 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
14330 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
14340 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
14350 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
14360 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
14370 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
14380 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
14390 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
143a0 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
143b0 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
143c0 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
143d0 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
143e0 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
143f0 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
14400 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
14410 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
14420 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
14430 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
14440 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
14450 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
14460 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
14470 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
14480 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
14490 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
144a0 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
144b0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
144c0 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
144d0 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
144e0 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
144f0 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
14500 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
14510 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
14520 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
14530 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
14540 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
14550 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
14560 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
14570 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
14580 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
14590 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
145a0 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
145b0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
145c0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
145d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
145e0 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
145f0 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
14600 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
14610 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
14620 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
14630 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
14640 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
14650 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
14660 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
14670 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14680 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
14690 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
146a0 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
146b0 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
146c0 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
146d0 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
146e0 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
146f0 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
14700 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
14710 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
14720 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
14730 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
14740 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
14750 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
14760 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
14770 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
14780 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
14790 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
147a0 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
147b0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
147c0 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
147d0 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
147e0 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
147f0 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
14800 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
14810 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
14820 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
14830 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
14840 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
14850 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
14860 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
14870 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
14880 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14890 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
148a0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
148b0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
148c0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
148d0 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
148e0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
148f0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
14900 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
14910 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
14920 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
14930 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
14940 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
14950 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
14960 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
14970 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
14980 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
14990 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
149a0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
149b0 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
149c0 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  at);.  u32 len;.
149d0 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
149e0 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
149f0 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
14a00 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
14a10 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
14a20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
14a30 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
14a40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14a50 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
14a60 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
14a70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
14a80 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
14a90 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
14aa0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
14ab0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
14ac0 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
14ad0 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
14ae0 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
14af0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
14b00 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
14b10 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
14b20 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20  =(u32)nBuf );.  
14b30 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
14b40 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
14b50 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
14b60 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
14b70 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
14b80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
14b90 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
14ba0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
14bb0 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
14bc0 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
14bd0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
14be0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
14bf0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
14c00 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
14c10 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14c20 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
14c30 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
14c40 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
14c50 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
14c60 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
14c70 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
14c80 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
14c90 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
14ca0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
14cb0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
14cc0 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
14cd0 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20   nBuf>=0 );.    
14ce0 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32    if( len > (u32
14cf0 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  )nBuf ){.       
14d00 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66   len = (u32)nBuf
14d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14d20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
14d30 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
14d40 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
14d50 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
14d60 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
14d70 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
14d80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
14d90 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
14da0 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
14db0 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
14dc0 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
14dd0 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
14de0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
14df0 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
14e00 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14e10 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
14e20 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
14e30 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
14e40 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
14e50 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
14e60 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
14e70 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
14e80 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
14e90 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
14ea0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
14eb0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
14ec0 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ee0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
14ef0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
14f00 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
14f10 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
14f20 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
14f30 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
14f40 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
14f50 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
14f60 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
14f70 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
14f80 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
14f90 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
14fa0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14fb0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
14fc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14fd0 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
14fe0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14ff0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15000 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
15010 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
15020 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15030 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
15040 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
15050 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
15060 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
15070 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
15080 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
15090 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
150a0 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
150b0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
150c0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
150d0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
150e0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
150f0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
15100 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
15110 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
15120 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
15130 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
15140 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
15150 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15160 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15170 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
15180 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
15190 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
151a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
151b0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
151c0 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
151d0 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
151e0 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
151f0 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
15200 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
15210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
15220 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15230 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
15240 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
15250 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
15260 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
15270 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
15280 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
15290 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
152a0 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
152b0 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
152c0 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
152d0 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
152e0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
152f0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
15300 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15310 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
15320 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
15330 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
15340 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
15350 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
15360 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
15370 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
15380 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
15390 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
153a0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
153b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
153c0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
153d0 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
153e0 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
153f0 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
15400 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
15410 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
15420 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
15430 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
15440 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
15450 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
15460 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
15470 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
15480 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
15490 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
154a0 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
154b0 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
154c0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
154d0 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
154e0 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
154f0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
15500 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
15510 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
15520 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
15530 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
15540 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
15550 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
15560 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
15570 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
15580 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
15590 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
155a0 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
155b0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
155c0 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
155d0 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
155e0 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
155f0 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
15600 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
15610 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
15620 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
15630 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
15640 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
15650 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
15660 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
15670 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
15680 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
15690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
156a0 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
156b0 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
156c0 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
156d0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
156e0 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
156f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
15700 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
15710 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
15720 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
15730 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
15740 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
15750 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
15760 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
15770 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
15780 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
15790 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
157a0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
157b0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
157c0 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
157d0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
157e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
157f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
15800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
15810 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ult: {.      u32
15820 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
15830 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
15840 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
15850 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
15860 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
15870 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
15880 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
15890 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
158a0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
158b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
158c0 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
158d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
158e0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
158f0 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
15900 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
15910 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
15920 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15930 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
15940 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
15950 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
15960 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
15970 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
15980 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
15990 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
159a0 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
159b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
159c0 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
159d0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
159e0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
159f0 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
15a00 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
15a10 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
15a20 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
15a30 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
15a40 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
15a50 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
15a60 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
15a70 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
15a80 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
15a90 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
15aa0 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
15ab0 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
15ac0 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
15ad0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
15ae0 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
15af0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
15b00 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
15b10 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
15b20 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
15b30 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
15b40 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
15b50 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
15b60 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
15b70 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
15b80 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
15b90 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
15ba0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
15bb0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
15bc0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
15bd0 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
15be0 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
15bf0 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
15c00 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
15c10 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
15c20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
15c30 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
15c40 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
15c50 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
15c60 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
15c70 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
15c80 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
15c90 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
15ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15cb0 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
15cc0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
15cd0 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
15ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15cf0 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
15d00 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
15d10 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
15d20 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
15d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
15d40 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
15d50 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15d60 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d80 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
15d90 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
15da0 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
15db0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
15dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15dd0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
15de0 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
15df0 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
15e00 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
15e10 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
15e20 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
15e30 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
15e40 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
15e50 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
15e60 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
15e70 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
15e80 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
15e90 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
15ea0 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
15eb0 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
15ec0 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
15ed0 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
15ee0 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
15ef0 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
15f00 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
15f10 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
15f20 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
15f30 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
15f40 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
15f50 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
15f60 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
15f70 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
15f80 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
15f90 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
15fa0 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
15fb0 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
15fc0 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
15fd0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
15fe0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
15ff0 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
16000 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
16010 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
16020 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
16030 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
16040 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
16050 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
16060 63 6f 72 64 29 29 5d 3b 0a 20 20 70 2d 3e 70 4b  cord))];.  p->pK
16070 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
16080 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
16090 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
160a0 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
160b0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
160c0 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
160d0 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
160e0 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
160f0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
16100 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
16110 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
16120 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
16130 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
16140 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
16150 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
16160 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
16170 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
16180 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
16190 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
161a0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
161b0 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
161c0 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
161d0 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
161e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
161f0 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
16200 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
16210 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
16220 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
16230 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
16240 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
16250 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
16260 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
16270 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
16280 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
16290 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
162a0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
162b0 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
162c0 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
162d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
162f0 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
16300 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
16310 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16330 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
16340 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
16350 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
16360 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
16370 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a    p->flags = 0;.
16380 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
16390 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
163a0 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  Mem) );.  idx = 
163b0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
163c0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
163d0 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a  szHdr;.  u = 0;.
163e0 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
163f0 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c  dr && u<p->nFiel
16400 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a  d && d<=nKey ){.
16410 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
16420 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d  ype;..    idx +=
16430 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
16440 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f  ey[idx], serial_
16450 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  type);.    pMem-
16460 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  >enc = pKeyInfo-
16470 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  >enc;.    pMem->
16480 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
16490 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e  b;.    /* pMem->
164a0 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71  flags = 0; // sq
164b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
164c0 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68  et() will set th
164d0 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  is for us */.   
164e0 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pMem->zMalloc =
164f0 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
16500 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
16510 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
16520 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
16530 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
16540 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  u++;.  }.  asser
16550 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
16560 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20  nField + 1 );.  
16570 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d  p->nField = u;.}
16580 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16590 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
165a0 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
165b0 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
165c0 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
165d0 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
165e0 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
165f0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
16600 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
16610 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
16620 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
16630 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
16640 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
16650 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
16660 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
16670 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
16680 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
16690 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
166a0 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
166b0 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
166c0 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
166d0 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
166e0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
166f0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
16700 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
16710 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
16720 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
16730 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
16740 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
16750 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77  ds..** The key w
16760 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64 73  ith fewer fields
16770 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70   is usually comp
16780 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74  ares less than t
16790 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65  he .** longer ke
167a0 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20 74  y.  However if t
167b0 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
167c0 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b  KEY flags in pPK
167d0 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e  ey2 is set.** an
167e0 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
167f0 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c  fixes are equal,
16800 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65   then key1 is le
16810 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a  ss than key2..**
16820 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41 43   Or if the UNPAC
16830 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58  KED_MATCH_PREFIX
16840 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
16850 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61 72   the prefixes ar
16860 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e  e.** equal, then
16870 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f   the keys are co
16880 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
16890 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20  qual and.** the 
168a0 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65  parts beyond the
168b0 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61   common prefix a
168c0 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  re ignored..**.*
168d0 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45  * If the UNPACKE
168e0 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66  D_IGNORE_ROWID f
168f0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
16900 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
16910 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  f.** the header 
16920 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f  of pKey1 is igno
16930 72 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  red.  It is assu
16940 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31 20 69  med that pKey1 i
16950 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65  s.** an index ke
16960 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73  y, and thus ends
16970 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 76 61   with a rowid va
16980 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62  lue.  The last b
16990 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65  yte.** of the he
169a0 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66  ader will theref
169b0 6f 72 65 20 62 65 20 74 68 65 20 73 65 72 69 61  ore be the seria
169c0 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
169d0 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31  wid:.** one of 1
169e0 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c  , 2, 3, 4, 5, 6,
169f0 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69   8, or 9 - the i
16a00 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20 74 79  nteger serial ty
16a10 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69  pes..** The seri
16a20 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  al type of the f
16a30 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20  inal rowid will 
16a40 61 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e 67  always be a sing
16a50 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69  le byte..** By i
16a60 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73  gnoring this las
16a70 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
16a80 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74  ader, we force t
16a90 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  he comparison.**
16aa0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72   to ignore the r
16ab0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
16ac0 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20  of key1..*/.int 
16ad0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
16ae0 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
16af0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
16b00 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
16b10 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
16b20 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
16b30 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
16b40 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  t key */.){.  in
16b50 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  t d1;           
16b60 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
16b70 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
16b80 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
16b90 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
16ba0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
16bb0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
16bc0 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
16bd0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
16be0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
16bf0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
16c00 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
16c10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
16c20 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
16c30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
16c40 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
16c50 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
16c60 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
16c70 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16c80 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
16c90 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
16ca0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
16cb0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
16cc0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
16cd0 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
16ce0 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
16cf0 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
16d00 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
16d10 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
16d20 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
16d30 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
16d40 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  .zMalloc = 0; ) 
16d50 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
16d60 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
16d70 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ments */..  /* C
16d80 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d  ompilers may com
16d90 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e  plain that mem1.
16da0 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c  u.i is potential
16db0 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ly uninitialized
16dc0 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ..  ** We could 
16dd0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61  initialize it, a
16de0 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f  s shown here, to
16df0 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63   silence those c
16e00 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20  omplaints..  ** 
16e10 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d  But in fact, mem
16e20 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72  1.u.i will never
16e30 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65   actually be use
16e40 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c  d uninitialized,
16e50 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a   and doing .  **
16e60 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79   the unnecessary
16e70 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
16e80 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65  has a measurable
16e90 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72   negative perfor
16ea0 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63  mance.  ** impac
16eb0 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  t, since this ro
16ec0 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20  utine is a very 
16ed0 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e  high runner.  An
16ee0 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a  d so, we choose.
16ef0 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74    ** to ignore t
16f00 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  he compiler warn
16f10 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74  ings and leave t
16f20 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69  his variable uni
16f30 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
16f40 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20  .  /*  mem1.u.i 
16f50 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65  = 0;  // not nee
16f60 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c  ded, here to sil
16f70 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  ence compiler wa
16f80 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64  rning */.  .  id
16f90 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
16fa0 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
16fb0 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
16fc0 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
16fd0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
16fe0 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20  GNORE_ROWID ){. 
16ff0 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d     szHdr1--;.  }
17000 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
17010 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
17020 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
17030 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
17040 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
17050 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
17060 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
17070 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
17080 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
17090 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
170a0 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
170b0 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
170c0 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
170d0 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
170e0 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
170f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17100 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
17110 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
17120 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
17130 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
17140 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
17150 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
17160 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17170 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
17180 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
17190 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
171a0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
171b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
171c0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
171d0 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
171e0 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17200 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
17210 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
17220 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
17230 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
17240 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
17250 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
17260 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
17270 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72  ..      /* Inver
17280 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20  t the result if 
17290 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53  we are using DES
172a0 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
172b0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
172c0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
172d0 26 26 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70  && i<nField && p
172e0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
172f0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
17300 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
17310 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f    }.    .      /
17320 2a 20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f  * If the PREFIX_
17330 53 45 41 52 43 48 20 66 6c 61 67 20 69 73 20 73  SEARCH flag is s
17340 65 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64  et and all field
17350 73 20 65 78 63 65 70 74 20 74 68 65 20 66 69 6e  s except the fin
17360 61 6c 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  al.      ** rowi
17370 64 20 66 69 65 6c 64 20 77 65 72 65 20 65 71 75  d field were equ
17380 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74  al, then clear t
17390 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48  he PREFIX_SEARCH
173a0 20 66 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20   flag and set . 
173b0 20 20 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e       ** pPKey2->
173c0 72 6f 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c  rowid to the val
173d0 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ue of the rowid 
173e0 66 69 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c  field in (pKey1,
173f0 20 6e 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a   nKey1)..      *
17400 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
17410 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  y the OP_IsUniqu
17420 65 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20  e opcode..      
17430 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  */.      if( (pP
17440 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
17450 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
17460 41 52 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b  ARCH) && i==(pPK
17470 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29  ey2->nField-1) )
17480 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17490 28 20 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26  ( idx1==szHdr1 &
174a0 26 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20  & rc );.        
174b0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61  assert( mem1.fla
174c0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
174d0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
174e0 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b  flags &= ~UNPACK
174f0 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
17500 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65 79 32  ;.        pPKey2
17510 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75  ->rowid = mem1.u
17520 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
17530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
17550 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  .  }..  /* No me
17560 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
17570 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
17580 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
17590 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
175a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
175b0 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
175c0 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
175d0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
175e0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
175f0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
17600 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
17610 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
17620 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
17630 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  1.zMalloc==0 );.
17640 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
17650 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
17660 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
17670 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
17680 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
17690 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
176a0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
176b0 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  l. If the UNPACK
176c0 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20  ED_INCRKEY.  ** 
176d0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
176e0 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20  n break the tie 
176f0 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32  by treating key2
17700 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a   as larger..  **
17710 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f   If the UPACKED_
17720 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61  PREFIX_MATCH fla
17730 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b  g is set, then k
17740 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20  eys with common 
17750 70 72 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72  prefixes.  ** ar
17760 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
17770 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72  be equal.  Other
17780 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72  wise, the longer
17790 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a   key is the .  *
177a0 2a 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74  * larger.  As it
177b0 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50   happens, the pP
177c0 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73  Key2 will always
177d0 20 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20   be the longer. 
177e0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20   ** if there is 
177f0 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  a difference..  
17800 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  */.  assert( rc=
17810 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65  =0 );.  if( pPKe
17820 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
17830 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a  CKED_INCRKEY ){.
17840 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d      rc = -1;.  }
17850 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
17860 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
17870 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29  D_PREFIX_MATCH )
17880 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72  {.    /* Leave r
17890 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  c==0 */.  }else 
178a0 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  if( idx1<szHdr1 
178b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
178c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
178d0 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  }. ../*.** pCur 
178e0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
178f0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
17900 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
17910 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
17920 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
17930 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
17940 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
17950 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
17960 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
17970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
17980 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
17990 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
179a0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
179b0 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
179c0 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
179d0 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
179e0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
179f0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
17a00 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
17a10 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
17a20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
17a30 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
17a40 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
17a50 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
17a60 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
17a70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
17a80 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
17a90 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
17aa0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
17ab0 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
17ac0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
17ad0 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
17ae0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
17af0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
17b00 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
17b10 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
17b20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
17b30 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
17b40 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
17b50 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a  METER(db);..  /*
17b60 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
17b70 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
17b80 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
17b90 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
17ba0 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
17bb0 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
17bc0 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
17bd0 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
17be0 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
17bf0 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
17c00 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
17c10 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
17c20 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
17c30 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
17c40 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
17c50 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
17c60 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
17c70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
17c80 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17c90 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
17ca0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
17cb0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
17cc0 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
17cd0 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
17ce0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17cf0 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
17d00 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
17d10 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
17d20 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
17d30 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
17d40 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
17d50 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
17d60 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
17d70 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
17d80 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
17d90 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73   entry */.  mems
17da0 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
17db0 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (m));.  rc = sql
17dc0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
17dd0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69  tree(pCur, 0, (i
17de0 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
17df0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
17e00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17e10 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
17e20 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
17e30 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
17e40 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
17e50 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
17e60 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
17e70 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
17e80 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
17e90 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
17ea0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17eb0 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
17ec0 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
17ed0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
17ee0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
17ef0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
17f00 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
17f10 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
17f20 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
17f30 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
17f40 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
17f50 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
17f60 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
17f70 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
17f80 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
17f90 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
17fa0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
17fb0 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
17fc0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17fd0 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
17fe0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17ff0 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
18000 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
18010 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18020 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
18030 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18040 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
18050 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18060 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
18070 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
18080 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
18090 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
180a0 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
180b0 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
180c0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
180d0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
180e0 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
180f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
18100 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
18110 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
18120 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
18130 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
18140 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
18150 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
18160 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
18170 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
18180 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
18190 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
181a0 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
181b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
181c0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
181d0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
181e0 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
181f0 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
18200 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
18210 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
18220 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
18230 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
18240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
18250 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
18260 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18270 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
18280 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
18290 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
182a0 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
182b0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
182c0 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
182d0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
182e0 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
182f0 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29  ( m.zMalloc!=0 )
18300 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
18310 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
18320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18330 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
18340 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
18350 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
18360 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
18370 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
18380 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
18390 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
183a0 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
183b0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
183c0 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
183d0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
183e0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
183f0 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
18400 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
18410 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
18420 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
18430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
18440 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
18450 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
18460 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
18470 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
18480 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
18490 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
184a0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
184b0 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
184c0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
184d0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
184e0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
184f0 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
18500 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
18510 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
18520 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
18530 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
18540 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
18550 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
18560 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
18570 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
18580 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73  pare(.  VdbeCurs
18590 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
185a0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
185b0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
185c0 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
185d0 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
185e0 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ked,  /* Unpacke
185f0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
18600 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
18610 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  nst */.  int *re
18620 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
18630 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
18640 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
18650 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
18660 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
18670 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
18680 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
18690 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
186a0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
186b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
186c0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
186d0 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
186e0 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
186f0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
18700 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
18710 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
18720 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
18730 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
18740 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
18750 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
18760 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
18770 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
18780 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
18790 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
187a0 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  say.  ** that bt
187b0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
187c0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
187d0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
187e0 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
187f0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
18800 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
18810 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
18820 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
18830 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18840 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
18850 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
18860 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
18870 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
18880 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
18890 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
188a0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
188b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
188c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
188d0 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
188e0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
188f0 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
18900 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c   );.  *res = sql
18910 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
18920 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
18930 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
18940 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
18950 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
18960 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18970 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18980 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
18990 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
189a0 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
189b0 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
189c0 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
189d0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
189e0 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
189f0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
18a00 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
18a10 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
18a20 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
18a30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18a40 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
18a50 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
18a60 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
18a70 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
18a80 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
18a90 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
18aa0 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
18ab0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
18ac0 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
18ad0 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
18ae0 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
18af0 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
18b00 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
18b10 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
18b20 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
18b30 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
18b40 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
18b50 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
18b60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18b70 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
18b80 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
18b90 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
18ba0 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
18bb0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
18bc0 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
18bd0 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
18be0 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
18bf0 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
18c00 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
18c10 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
18c20 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
18c30 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
18c40 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
18c50 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
18c60 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
18c70 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
18c80 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
18c90 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
18ca0 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
18cb0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
18cc0 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
18cd0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
18ce0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
18cf0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
18d00 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
18d10 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
18d20 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
18d30 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
18d40 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
18d50 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
18d60 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
18d70 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
18d80 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
18d90 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
18da0 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
18db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18dc0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
18dd0 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
18de0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
18df0 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
18e00 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
18e10 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
18e20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
18e30 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
18e40 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
18e50 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
18e60 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
18e70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
18e80 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
18e90 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
18ea0 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
18eb0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
18ec0 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
18ed0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
18ee0 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
18ef0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
18f00 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
18f10 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
18f20 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
18f30 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56  e3VdbeGetValue(V
18f40 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
18f50 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
18f60 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
18f70 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
18f80 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
18f90 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
18fa0 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
18fb0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
18fc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18fd0 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
18fe0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
18ff0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
19000 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
19010 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
19020 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
19030 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
19040 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
19050 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
19060 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
19070 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19080 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
19090 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b  pe((Mem *)pRet);
190a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
190b0 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
190c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
190d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
190e0 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
190f0 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
19100 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
19110 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
19120 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
19130 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
19140 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
19150 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
19160 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
19170 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
19180 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19190 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
191a0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
191b0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
191c0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
191d0 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
191e0 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
191f0 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
19200 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
19210 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
19220 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a           r-1));.  }.}.