/ Hex Artifact Content
Login

Artifact b810a66902ee40c71cdb9c64f43760da516c91df:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0f60: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0f70: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0f90: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0fa0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0fb0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0fc0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0fd0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0fe0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0ff0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
1000: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1020: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1030: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1050: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1060: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1070: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1080: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1090: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
10a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10b0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
10c0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
10e0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
10f0: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1100: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1110: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1120: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1130: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1140: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1150: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1160: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1170: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1180: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11a0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
11b0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
11c0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
11d0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
11e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1200: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1210: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1230: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1240: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1250: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1260: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1270: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1280: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1290: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
12b0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
12c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
12d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
12f0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1310: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1340: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1350: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1360: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1380: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1390: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
13a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
13b0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
13c0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
13d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13e0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
13f0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1410: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1420: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1430: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1440: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1460: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1470: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1490: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
14a0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
14b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
14c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
14d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
14e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14f0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1500: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1510: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1520: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1540: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1550: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1560: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1570: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1580: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1590: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
15a0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
15b0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
15c0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
15d0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
15e0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
15f0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1600: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1610: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1620: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1630: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1640: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1650: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1660: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1670: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1680: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1690: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
16a0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
16b0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
16c0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
16d0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
16e0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
16f0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1700: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1710: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1720: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1730: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1740: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1750: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1760: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1770: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1780: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1790: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
17a0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
17b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17c0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
17d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
17e0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
17f0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1800: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1810: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1820: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1830: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61    int n = p->nLa
1840: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  belAlloc*2 + 5;.
1850: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1860: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1870: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1880: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  n*sizeof(p->aLab
18c0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e  el[0]));.    p->
18d0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71  nLabelAlloc = sq
18e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18f0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1900: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  el)/sizeof(p->aL
1910: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  abel[0]);.  }.  
1920: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1930: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1940: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1950: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1960: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1970: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1980: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1990: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
19a0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
19b0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
19c0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
19d0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
19e0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
19f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1a00: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1a20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1a30: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1a40: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1a60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1a70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1a80: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1a90: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1aa0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1ab0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1ac0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1ad0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1ae0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1af0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1b00: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1b10: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1b20: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1b30: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1b40: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1b60: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1b70: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1b90: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1ba0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1bb0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1bc0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1bd0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1be0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1bf0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1c00: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1c10: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1c20: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1c30: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1c40: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1c50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c60: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1c70: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1c80: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1c90: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1ca0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1cb0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1ce0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1cf0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1d00: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1d10: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1d20: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1d30: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1d40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1d50: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1d60: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1d70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1d80: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1d90: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1da0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1db0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1dc0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1dd0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1de0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1df0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1e00: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1e10: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1e20: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1e30: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1e60: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1e70: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1e80: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1e90: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1ea0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1eb0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1ee0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1ef0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1f00: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1f10: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
1f20: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
1f30: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
1f40: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
1f50: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
1f60: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
1f70: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
1f80: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
1f90: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
1fa0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
1fb0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
1fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
1fd0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
1fe0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
1ff0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
2000: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2010: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2020: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2030: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2040: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2050: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2060: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2070: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2080: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2090: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
20a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
20b0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
20c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
20d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
20e0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
20f0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
2100: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2110: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2120: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2140: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2150: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2170: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2190: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
21a0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
21b0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
21c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
21d0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
21e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
21f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2210: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2220: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2230: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2250: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2270: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2280: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2290: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22a0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
22b0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
22c0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
22d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22e0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
22f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2300: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2310: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2320: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2330: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2340: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2350: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2370: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2380: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2390: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
23a0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
23b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
23c0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
23d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
23f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2400: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2410: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2420: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2430: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2440: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2450: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2460: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2470: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2480: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2490: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
24a0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
24b0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
24c0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
24d0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
24e0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
24f0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2500: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2520: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2540: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2550: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2560: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2570: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2580: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2590: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
25a0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
25b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
25c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
25d0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
25e0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
25f0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2600: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2610: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2620: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2630: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2640: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2650: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2660: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2670: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2680: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2690: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
26a0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
26b0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
26c0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
26d0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
26e0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
26f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2700: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2710: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2720: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2730: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2740: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2750: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2760: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2770: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2780: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2790: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
27a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
27b0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
27c0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
27d0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
27e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27f0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2800: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2810: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
2820: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2830: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2840: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
2850: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2860: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2870: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2880: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2890: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
28a0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
28b0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
28c0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
28d0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
28e0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
28f0: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2900: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2910: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
2920: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
2930: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
2940: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
2950: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
2960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2970: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2980: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2990: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
29a0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
29b0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
29c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
29d0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
29e0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
29f0: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2a00: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2a10: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
2a20: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
2a30: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
2a40: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
2a50: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
2a60: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
2a70: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2a80: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2a90: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2aa0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2ab0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2ac0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2ad0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2ae0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2af0: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2b00: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2b10: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
2b20: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
2b30: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
2b40: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
2b50: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
2b60: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
2b70: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2b80: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2b90: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2ba0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
2bb0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
2bc0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
2bd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
2be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2bf0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
2c00: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
2c10: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
2c20: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
2c30: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
2c40: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
2c50: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
2c60: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
2c70: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f  adOnly = 1;.  fo
2c80: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2c90: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2ca0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2cb0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2cc0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70  ->opcode;..    p
2cd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71  Op->opflags = sq
2ce0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
2cf0: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20  rty[opcode];.   
2d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2d10: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
2d20: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
2d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2d40: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
2d50: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
2d60: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
2d70: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e   opcode==OP_Tran
2d80: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
2d90: 70 32 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  p2!=0 ){.      p
2da0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
2db0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dc0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2dd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2de0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
2df0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
2e00: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
2e10: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
2e20: 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->p2;.    }else 
2e30: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
2e40: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
2e50: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
2e60: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
2e70: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
2e80: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
2e90: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2ea0: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2eb0: 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-1].p1;.      
2ec0: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2ed0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2ee0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2ef0: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
2f00: 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  gs & OPFLG_JUMP)
2f10: 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  !=0 && pOp->p2<0
2f20: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f30: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
2f40: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
2f50: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
2f60: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
2f70: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2f80: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
2f90: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
2fa0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
2fb0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
2fc0: 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  MaxArgs;.}../*.*
2fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
2fe0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2ff0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3000: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3020: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3030: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3040: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3050: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
3060: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
3070: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3080: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
3090: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
30a0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
30b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
30c0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
30d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
30e0: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
30f0: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3100: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3110: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3120: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3130: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3140: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
3150: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
3160: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
3170: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3180: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
3190: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
31a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
31b0: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
31c0: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
31d0: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
31e0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
31f0: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3200: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3210: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3220: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3230: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3240: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
3250: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
3260: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
3270: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
3280: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
3290: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
32a0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
32b0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
32c0: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
32d0: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
32e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
32f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3300: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3310: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3320: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3330: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3340: 61 4d 75 74 65 78 2e 6e 4d 75 74 65 78 3d 3d 30  aMutex.nMutex==0
3350: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
3360: 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41  Values(p, pnMaxA
3370: 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70  rg);.  *pnOp = p
3380: 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20  ->nOp;.  p->aOp 
3390: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f  = 0;.  return aO
33a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
33b0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
33c0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
33d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
33e0: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
33f0: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
3400: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
3410: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
3420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3430: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
3440: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
3450: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
3460: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
3470: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3480: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3490: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
34a0: 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  nOp > p->nOpAllo
34b0: 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79  c && growOpArray
34c0: 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (p) ){.    retur
34d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
34e0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
34f0: 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b  ALWAYS(nOp>0) ){
3500: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3510: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3520: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
3530: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
3540: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
3550: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
3560: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
3570: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
3580: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
3590: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
35a0: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
35b0: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
35c0: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
35d0: 28 20 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74  ( p2<0 && (sqlit
35e0: 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  e3OpcodeProperty
35f0: 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26  [pOut->opcode] &
3600: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
3610: 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  ){.        pOut-
3620: 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44  >p2 = addr + ADD
3630: 52 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  R(p2);.      }el
3640: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74  se{.        pOut
3650: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20  ->p2 = p2;.     
3660: 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70   }.      pOut->p
3670: 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20  3 = pIn->p3;.   
3680: 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20     pOut->p4type 
3690: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
36a0: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
36b0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   0;.      pOut->
36c0: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
36d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
36e0: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
36f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
3700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
3710: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
3720: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
3730: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
3740: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
3750: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
3760: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
3770: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
3780: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
3790: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
37a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
37b0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
37c0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
37d0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
37e0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
37f0: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
3800: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3810: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
3820: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
3830: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
3840: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
3850: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
3860: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
3870: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
3880: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3890: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69  ngeP1(Vdbe *p, i
38a0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
38b0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
38c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
38d0: 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ddr>=0 );.  if( 
38e0: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20  p->nOp>addr ){. 
38f0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3900: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
3910: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3920: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3930: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
3940: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
3950: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
3960: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
3970: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
3980: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
3990: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
39a0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
39b0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
39c0: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
39d0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
39e0: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
39f0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64    if( p->nOp>add
3a00: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3a10: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
3a20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3a30: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3a40: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
3a50: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3a60: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
3a70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3a80: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
3a90: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
3aa0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3ab0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
3ac0: 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66   addr>=0 );.  if
3ad0: 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b  ( p->nOp>addr ){
3ae0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
3af0: 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p3 = val;.  }.
3b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3b10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3b20: 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P5 operand for 
3b30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3b40: 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61  y.** added opera
3b50: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3b60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3b70: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61  5(Vdbe *p, u8 va
3b80: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
3ba0: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
3bb0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
3bc0: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
3bd0: 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d  1].p5 = val;.  }
3be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3bf0: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
3c00: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
3c10: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
3c20: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
3c30: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
3c40: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
3c50: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
3c60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3c70: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
3c80: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
3c90: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3ca0: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
3cb0: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  Op);.}.../*.** I
3cc0: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
3cd0: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
3ce0: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
3cf0: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
3d00: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
3d10: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
3d20: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
3d30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
3d40: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3d50: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
3d60: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b   FuncDef *pDef){
3d70: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44  .  if( ALWAYS(pD
3d80: 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c  ef) && (pDef->fl
3d90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
3da0: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
3db0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3dc0: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
3dd0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
3de0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
3df0: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
3e00: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
3e10: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
3e20: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
3e30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3e40: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
3e50: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
3e60: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
3e70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
3e80: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
3e90: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
3ea0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
3eb0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
3ec0: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
3ed0: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
3ee0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
3ef0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f00: 49 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20  INTARRAY:.      
3f10: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
3f20: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
3f30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3f40: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
3f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3f60: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
3f70: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20  PRINTF: {.      
3f80: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
3f90: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
3fa0: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
3fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3fc0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3fd0: 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20  P4_VDBEFUNC: {. 
3fe0: 20 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20         VdbeFunc 
3ff0: 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64  *pVdbeFunc = (Vd
4000: 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20  beFunc *)p4;.   
4010: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
4020: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  alFunction(db, p
4030: 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29  VdbeFunc->pFunc)
4040: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
4050: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4060: 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44  0 ) sqlite3VdbeD
4070: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64  eleteAuxData(pVd
4080: 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20  beFunc, 0);.    
4090: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
40a0: 65 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29  e(db, pVdbeFunc)
40b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
40c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
40d0: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
40e0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
40f0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4100: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
4110: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4130: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
4140: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4150: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4160: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
4170: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
4180: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
4190: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
41a0: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
41b0: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
41c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
41d0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
41e0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
41f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4200: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
4210: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4230: 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20  se P4_VTAB : {. 
4240: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4250: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4260: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
4270: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29  ck((VTable *)p4)
4280: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
42a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
42b0: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
42c0: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
42d0: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
42e0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
42f0: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
4300: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
4310: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
4320: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
4330: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
4340: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
4350: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
4360: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4370: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
4380: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
4390: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
43a0: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
43b0: 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e  =aOp; pOp<&aOp[n
43c0: 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  Op]; pOp++){.   
43d0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
43e0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
43f0: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
4400: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
4410: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4420: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
4430: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
4440: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4450: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
4460: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
4470: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
4480: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
4490: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
44a0: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
44b0: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
44c0: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
44d0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
44e0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
44f0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
4500: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
4510: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
4520: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
4530: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
4540: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
4550: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
4560: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
4570: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
4580: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
4590: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
45a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
45b0: 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69  N opcodes starti
45c0: 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f  ng at addr to No
45d0: 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  -ops..*/.void sq
45e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
45f0: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
4600: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b  nt addr, int N){
4610: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
4620: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4630: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
4640: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
4650: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77  b = p->db;.    w
4660: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
4670: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
4680: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
4690: 70 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  p4.p);.      mem
46a0: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
46b0: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
46c0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
46d0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
46e0: 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pOp++;.    }.  }
46f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4700: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4710: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
4720: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
4730: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
4740: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
4750: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
4760: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
4770: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
4780: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
4790: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
47a0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
47b0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
47c0: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
47d0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
47e0: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
47f0: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
4800: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
4810: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
4820: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
4830: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
4840: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4850: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
4860: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
4870: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
4880: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
4890: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
48a0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
48b0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
48c0: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
48d0: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
48e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f  .**.** If n==P4_
48f0: 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73  KEYINFO it means
4900: 20 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70   that zP4 is a p
4910: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
4920: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
4930: 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65  * A copy is made
4940: 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   of the KeyInfo 
4950: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d  structure into m
4960: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4970: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
4980: 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65  alloc, to be fre
4990: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
49a0: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a   is finalized..*
49b0: 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  * n==P4_KEYINFO_
49c0: 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65  HANDOFF indicate
49d0: 73 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  s that zP4 point
49e0: 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  s to a KeyInfo s
49f0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72  tructure.** stor
4a00: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61  ed in memory tha
4a10: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
4a20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4a30: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54  qlite3_malloc. T
4a40: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
4a50: 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68  ould not free th
4a60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74  e allocation, it
4a70: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77   will be freed w
4a80: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a  hen the Vdbe is.
4a90: 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  ** finalized..**
4aa0: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
4ab0: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
4ac0: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
4ad0: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
4ae0: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
4af0: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
4b00: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
4b10: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
4b20: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
4b30: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
4b40: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
4b50: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
4b60: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
4b70: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
4b80: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
4b90: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
4ba0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
4bb0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
4bc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4bd0: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
4be0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
4bf0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
4c00: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
4c10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
4c20: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
4c30: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
4c40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4c50: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
4c60: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  IT );.  if( p->a
4c70: 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op==0 || db->mal
4c80: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
4c90: 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49   if ( n!=P4_KEYI
4ca0: 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41  NFO && n!=P4_VTA
4cb0: 42 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  B ) {.      free
4cc0: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
4cd0: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4cf0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
4d00: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
4d10: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
4d20: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
4d30: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
4d40: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
4d50: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
4d60: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
4d70: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
4d80: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
4d90: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
4da0: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
4db0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
4dc0: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
4dd0: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
4de0: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
4df0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
4e00: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
4e10: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
4e20: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
4e30: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
4e40: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
4e50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
4e60: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
4e70: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
4e80: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
4e90: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
4ea0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
4eb0: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
4ec0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
4ed0: 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
4ee0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  KeyInfo;.    int
4ef0: 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a   nField, nByte;.
4f00: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
4f10: 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e  KeyInfo*)zP4)->n
4f20: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
4f30: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
4f40: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
4f50: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
4f60: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e  o->aColl[0]) + n
4f70: 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49  Field;.    pKeyI
4f80: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
4f90: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79 74  allocRaw(0, nByt
4fa0: 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  e);.    pOp->p4.
4fb0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
4fc0: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  nfo;.    if( pKe
4fd0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75  yInfo ){.      u
4fe0: 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  8 *aSortOrder;. 
4ff0: 20 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61       memcpy((cha
5000: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34  r*)pKeyInfo, zP4
5010: 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c 64  , nByte - nField
5020: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
5030: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
5040: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
5050: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
5060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
5070: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5080: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
5090: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
50a0: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
50b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
50c0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
50d0: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
50e0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
50f0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
5100: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
5110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5120: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5130: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
5140: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5150: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
5160: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
5170: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
5180: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5190: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
51a0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
51b0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
51c0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
51d0: 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d  VTAB ){.    pOp-
51e0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
51f0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5200: 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20  ype = P4_VTAB;. 
5210: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f     sqlite3VtabLo
5220: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ck((VTable *)zP4
5230: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
5240: 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e  (VTable *)zP4)->
5250: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
5260: 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a  else if( n<0 ){.
5270: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5280: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
5290: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73  pOp->p4type = (s
52a0: 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20  igned char)n;.  
52b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
52c0: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
52d0: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
52e0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
52f0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5300: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
5310: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5320: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
5330: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
5340: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  EBUG./*.** Chang
5350: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
5360: 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65   the the most re
5370: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
5380: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
5390: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
53a0: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
53b0: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
53c0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
53d0: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
53e0: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
53f0: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
5400: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
5410: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
5420: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
5430: 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  uild..*/.void sq
5440: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
5450: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
5460: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5470: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5480: 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  p;.  if( !p ) re
5490: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
54a0: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
54b0: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
54c0: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
54d0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
54e0: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
54f0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5500: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
5510: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
5520: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
5530: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5540: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
5550: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
5560: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5570: 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20  p->db, *pz);.   
5580: 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d   *pz = sqlite3VM
5590: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
55a0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
55b0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
55c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
55d0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
55e0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
55f0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5600: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5610: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
5620: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
5630: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
5640: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
5650: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70  >nOp>0 || p->aOp
5660: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
5670: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
5680: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5690: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d  Comment==0 || p-
56a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
56b0: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
56c0: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  p ){.    char **
56d0: 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  pz = &p->aOp[p->
56e0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b  nOp-1].zComment;
56f0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
5700: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
5710: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
5720: 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a  >db, *pz);.    *
5730: 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  pz = sqlite3VMPr
5740: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
5750: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5760: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5770: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
5780: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  G */../*.** Retu
5790: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
57a0: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
57b0: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
57c0: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
57d0: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
57e0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
57f0: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
5800: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
5810: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
5820: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
5830: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
5840: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
5850: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
5860: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
5870: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
5880: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
5890: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
58a0: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
58b0: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
58c0: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
58d0: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
58e0: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
58f0: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
5900: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
5910: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
5920: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20  ning.** after a 
5930: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
5940: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
5950: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
5960: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
5970: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5980: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
5990: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
59a0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
59b0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
59c0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
59d0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
59e0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
59f0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
5a00: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
5a10: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a  ith Valgrind..**
5a20: 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69  .** About the #i
5a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5a40: 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c  _TRACE:  Normall
5a50: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
5a60: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a  is never called.
5a70: 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70  ** unless p->nOp
5a80: 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63  >0.  This is bec
5a90: 61 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65  ause in the abse
5aa0: 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  nse of SQLITE_OM
5ab0: 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20  IT_TRACE,.** an 
5ac0: 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63  OP_Trace instruc
5ad0: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
5ae0: 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74  nserted by sqlit
5af0: 65 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73  e3VdbeGet() as s
5b00: 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20  oon as.** a new 
5b10: 56 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e  VDBE is created.
5b20: 20 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65    So we are free
5b30: 20 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20   to set addr to 
5b40: 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74  p->nOp-1 without
5b50: 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f  .** having to do
5b60: 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61  uble-check to ma
5b70: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5b80: 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e   result is non-n
5b90: 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20  egative. But.** 
5ba0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  if SQLITE_OMIT_T
5bb0: 52 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c  RACE is defined,
5bc0: 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73   the OP_Trace is
5bd0: 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20   omitted and we 
5be0: 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68  do need to.** ch
5bf0: 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66  eck the value of
5c00: 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65   p->nOp-1 before
5c10: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a   continuing..*/.
5c20: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
5c30: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
5c40: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
5c50: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
5c60: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
5c70: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
5c80: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
5c90: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
5ca0: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
5cb0: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
5cc0: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
5cd0: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
5ce0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
5cf0: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
5d00: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
5d10: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
5d20: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
5d30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5d40: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5d50: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
5d60: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
5d70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
5d80: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
5d90: 30 20 29 20 72 65 74 75 72 6e 20 28 56 64 62 65  0 ) return (Vdbe
5da0: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64  Op*)&dummy;.#end
5db0: 69 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  if.    addr = p-
5dc0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
5dd0: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
5de0: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
5df0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
5e00: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
5e10: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5e20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
5e30: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
5e40: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
5e50: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
5e60: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
5e70: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5e80: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
5e90: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
5ea0: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
5eb0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
5ec0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
5ed0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
5ee0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
5ef0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
5f00: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
5f10: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
5f20: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
5f30: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
5f40: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
5f50: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
5f60: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
5f70: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
5f80: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
5f90: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
5fa0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
5fb0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
5fc0: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
5fd0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
5fe0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  se P4_KEYINFO_ST
5ff0: 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  ATIC:.    case P
6000: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
6010: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6020: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
6030: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
6040: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  KeyInfo;.      s
6050: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6060: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
6070: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
6080: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
6090: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
60a0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
60b0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
60c0: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
60d0: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
60e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
60f0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
6100: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
6110: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
6120: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
6130: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43  lite3Strlen30(pC
6140: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
6150: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
6160: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
6170: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
6180: 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29  emp[i],",...",4)
6190: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
61a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
61b0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
61c0: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
61d0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
61e0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
61f0: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
6200: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
6210: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
6220: 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  i++] = '-';.    
6230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6240: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
6250: 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  i], pColl->zName
6260: 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ,n+1);.         
6270: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20   i += n;.       
6280: 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e   }else if( i+4<n
6290: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
62a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
62b0: 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a  p[i],",nil",4);.
62c0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
62d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
62e0: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
62f0: 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  i++] = ')';.    
6300: 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a    zTemp[i] = 0;.
6310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
6320: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62  nTemp );.      b
6330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6340: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
6350: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
6360: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
6370: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
6380: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6390: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63  nTemp, zTemp, "c
63a0: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
63b0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
63c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
63d0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
63e0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
63f0: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
6400: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
6410: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6420: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6430: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
6440: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
6450: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
6460: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6470: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6490: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
64a0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
64b0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
64c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
64d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
64e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
64f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6500: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
6510: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
6520: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6530: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
6540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6550: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6560: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
6570: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
6580: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6590: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
65a0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
65b0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
65c0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  .pMem;.      ass
65d0: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
65e0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
65f0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   );.      if( pM
6600: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6610: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
6620: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
6630: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
6640: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6650: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
6660: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6670: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6680: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
6690: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
66a0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
66b0: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
66c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
66d0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
66e0: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
66f0: 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r);.      }els
6700: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
6710: 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  t( pMem->flags &
6720: 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
6730: 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f       zP4 = "(blo
6740: 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b)";.      }.   
6750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6760: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6770: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6780: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
6790: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
67a0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
67b0: 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
67c0: 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  pVtab;.      sql
67d0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
67e0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61  emp, zTemp, "vta
67f0: 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c  b:%p:%p", pVtab,
6800: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29   pVtab->pModule)
6810: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6820: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6830: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
6840: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6850: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6860: 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72  , zTemp, "intarr
6870: 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ay");.      brea
6880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6890: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
68a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
68b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
68c0: 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d   zTemp, "program
68d0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
68e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
68f0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
6900: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
6910: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
6920: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
6930: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
6940: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
6950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6960: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
6970: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
6980: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
6990: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
69a0: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
69b0: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
69c0: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
69d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
69e0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61  red statement ha
69f0: 73 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76  s to know in adv
6a00: 61 6e 63 65 20 77 68 69 63 68 20 42 74 72 65 65  ance which Btree
6a10: 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 77 69 6c 6c   objects.** will
6a20: 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74   be used so that
6a30: 20 69 74 20 63 61 6e 20 61 63 71 75 69 72 65 20   it can acquire 
6a40: 6d 75 74 65 78 65 73 20 6f 6e 20 74 68 65 6d 20  mutexes on them 
6a50: 61 6c 6c 20 69 6e 20 73 6f 72 74 65 64 0a 2a 2a  all in sorted.**
6a60: 20 6f 72 64 65 72 20 28 76 69 61 20 73 71 6c 69   order (via sqli
6a70: 74 65 33 56 64 62 65 4d 75 74 65 78 41 72 72 61  te3VdbeMutexArra
6a80: 79 45 6e 74 65 72 28 29 2e 20 20 4d 75 74 65 78  yEnter().  Mutex
6a90: 65 73 20 61 72 65 20 61 63 71 75 69 72 65 64 0a  es are acquired.
6aa0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 28 61 6e 64  ** in order (and
6ab0: 20 72 65 6c 65 61 73 65 64 20 69 6e 20 72 65 76   released in rev
6ac0: 65 72 73 65 20 6f 72 64 65 72 29 20 74 6f 20 61  erse order) to a
6ad0: 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2e 0a  void deadlocks..
6ae0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6af0: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
6b00: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
6b10: 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  int mask;.  asse
6b20: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
6b30: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69  >db->nDb && i<si
6b40: 7a 65 6f 66 28 75 33 32 29 2a 38 20 29 3b 0a 20  zeof(u32)*8 );. 
6b50: 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29   assert( i<(int)
6b60: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
6b70: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b  ask)*8 );.  mask
6b80: 20 3d 20 28 28 75 33 32 29 31 29 3c 3c 69 3b 0a   = ((u32)1)<<i;.
6b90: 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d    if( (p->btreeM
6ba0: 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
6bb0: 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61  {.    p->btreeMa
6bc0: 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
6bd0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
6be0: 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d  xArrayInsert(&p-
6bf0: 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e  >aMutex, p->db->
6c00: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d  aDb[i].pBt);.  }
6c10: 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .}...#if defined
6c20: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
6c30: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
6c40: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
6c50: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
6c60: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
6c70: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
6c80: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
6c90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6ca0: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
6cb0: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
6cc0: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
6cd0: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
6ce0: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
6cf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
6d00: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
6d10: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34   %4d %4d %4d %-4
6d20: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
6d30: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
6d40: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
6d50: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
6d60: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
6d70: 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e  (zPtr));.  fprin
6d80: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
6d90: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
6da0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
6db0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
6dc0: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
6dd0: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
6de0: 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51  p->p5,.#ifdef SQ
6df0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
6e00: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f   pOp->zComment ?
6e10: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a   pOp->zComment :
6e20: 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   "".#else.      
6e30: 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  "".#endif.  );. 
6e40: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
6e50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
6e60: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
6e70: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
6e80: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
6e90: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
6ea0: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
6eb0: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
6ec0: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a  .    Mem *pEnd;.
6ed0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
6ee0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
6ef0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
6f00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6f10: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
6f20: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
6f30: 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b      for(pEnd=&p[
6f40: 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  N]; p<pEnd; p++)
6f50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6f60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
6f70: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
6f80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
6f90: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e     }.    for(pEn
6fa0: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b  d=&p[N]; p<pEnd;
6fb0: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   p++){.      ass
6fc0: 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45  ert( (&p[1])==pE
6fd0: 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70  nd || p[0].db==p
6fe0: 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20  [1].db );..     
6ff0: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
7000: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
7010: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
7020: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7030: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
7040: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
7050: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
7060: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
7070: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
7080: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
7090: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
70a0: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
70b0: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
70c0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
70d0: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
70e0: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
70f0: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
7100: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
7110: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
7120: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
7130: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
7140: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
7150: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
7160: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
7170: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
7180: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
7190: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
71a0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
71b0: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
71c0: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
71d0: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
71e0: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
71f0: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
7200: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
7210: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
7220: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
7230: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
7240: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
7250: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
7260: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
7270: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
7280: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
7290: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
72a0: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
72b0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
72c0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
72d0: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
72e0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
72f0: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
7300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7310: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
7320: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7330: 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  ( p->zMalloc ){.
7340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7350: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
7360: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
7370: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
7380: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
7390: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
73a0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  l;.    }.    db-
73b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
73c0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
73d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
73e0: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
73f0: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
7400: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
7410: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
7420: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
7430: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
7440: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
7450: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
7460: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
7470: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
7480: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
7490: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
74a0: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
74b0: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
74c0: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
74d0: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
74e0: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
74f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
7500: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
7510: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
7520: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
7530: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
7540: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
7550: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
7560: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
7570: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
7580: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7590: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
75a0: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
75b0: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
75c0: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
75d0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
75e0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
75f0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
7600: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
7610: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
7620: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
7630: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
7640: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
7650: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
7660: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
7670: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
7680: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
7690: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
76a0: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
76b0: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
76c0: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
76d0: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
76e0: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
76f0: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
7700: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
7710: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
7720: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
7730: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
7740: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
7750: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
7760: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
7770: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
7780: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
7790: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
77a0: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
77b0: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
77c0: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
77d0: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
77e0: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
77f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
7800: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
7810: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
7820: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
7830: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
7840: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
7870: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
7880: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
7890: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78b0: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
78c0: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
78d0: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
78e0: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
78f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
7900: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
7910: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
7920: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
7940: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
7950: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
7960: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
7970: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
7980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7990: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
79a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
79b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
79e0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
79f0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7a10: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
7a20: 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65  m *pMem = p->pRe
7a30: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
7a40: 65 6d 5b 31 5d 3b 20 20 2f 2a 20 46 69 72 73 74  em[1];  /* First
7a50: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
7a60: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
7a70: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
7a80: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
7a90: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
7aa0: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
7ab0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
7ac0: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
7ad0: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
7ae0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
7af0: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
7b00: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
7b10: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
7b20: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
7b30: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
7b40: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
7b50: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
7b60: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
7b70: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
7b80: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
7b90: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
7ba0: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
7bb0: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
7bc0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
7bd0: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20  ay(pMem, 8);..  
7be0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
7bf0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
7c00: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
7c10: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
7c20: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
7c30: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
7c40: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
7c50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
7c60: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
7c70: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
7c80: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
7c90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
7ca0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
7cb0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
7cc0: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
7cd0: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
7ce0: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
7cf0: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
7d00: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
7d10: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
7d20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
7d30: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
7d40: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
7d50: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
7d60: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
7d70: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
7d80: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
7d90: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
7da0: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
7db0: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
7dc0: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
7dd0: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
7de0: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
7df0: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
7e00: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
7e10: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
7e20: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
7e30: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
7e40: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
7e50: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
7e60: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
7e70: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
7e80: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
7e90: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
7ea0: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
7eb0: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
7ec0: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
7ed0: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
7ee0: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
7ef0: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
7f00: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
7f10: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
7f20: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
7f30: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
7f40: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
7f50: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
7f60: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
7f70: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
7f80: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
7f90: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
7fa0: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
7fb0: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
7fc0: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
7fd0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
7fe0: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
7ff0: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
8000: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
8010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
8020: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
8030: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
8040: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
8050: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
8060: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
8070: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
8080: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
8090: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
80a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
80b0: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
80c0: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
80d0: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
80e0: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
80f0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
8100: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
8110: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
8120: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8130: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
8140: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
8150: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
8160: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
8170: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8180: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
8190: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
81a0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
81b0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
81c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
81d0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
81e0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
81f0: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
8200: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
8210: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
8220: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
8230: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
8240: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
8250: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
8260: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
8270: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
8280: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
8290: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
82a0: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
82b0: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
82c0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
82d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
82e0: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
82f0: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
8300: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
8310: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
8320: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
8330: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8340: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
8350: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
8360: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
8370: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
8380: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
8390: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
83a0: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
83b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
83c0: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
83d0: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
83e0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
83f0: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
8400: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8410: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
8420: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
8430: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
8440: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
8470: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
8480: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
8490: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
84a0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
84b0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
84c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
84d0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
84e0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
84f0: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
8500: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
8510: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
8520: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8530: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8540: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
8550: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
8560: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
8570: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
8580: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
8590: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
85a0: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
85b0: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
85c0: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
85d0: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
85e0: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
85f0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
8600: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
8610: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
8620: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
8630: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
8640: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
8650: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
8660: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
8670: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
8680: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
8690: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
86a0: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
86b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
86c0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
86d0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
86e0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
86f0: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
8700: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
8710: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
8720: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
8730: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
8740: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
8750: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
8760: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
8770: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8780: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
8790: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
87a0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
87b0: 20 6e 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20   nByte, 1) ){.  
87c0: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
87d0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
87e0: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
87f0: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
8800: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
8810: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
8820: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
8830: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
8840: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
8850: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
8860: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
8870: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8880: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8890: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
88a0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
88b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
88d0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
88e0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
88f0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
8900: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
8910: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
8920: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
8930: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8950: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
8960: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8970: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
8980: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
8990: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
89a0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
89b0: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89d0: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
89e0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
89f0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
8a00: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
8a10: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
8a20: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
8a30: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
8a40: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
8a50: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
8a60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8a70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8a80: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
8a90: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8aa0: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
8ab0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
8ac0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
8ad0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
8ae0: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
8af0: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
8b00: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
8b10: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
8b20: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
8b30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b40: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8b50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8b60: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8b70: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8b80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8b90: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8ba0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
8bb0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
8bc0: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
8bd0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8be0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
8bf0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
8c00: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
8c10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
8c20: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
8c30: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8c40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c50: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
8c60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8c70: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
8c80: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
8c90: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
8ca0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8cb0: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
8cc0: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
8cd0: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
8ce0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
8cf0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
8d00: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
8d10: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
8d20: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
8d30: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
8d40: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
8d50: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
8d60: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
8d70: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
8d80: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
8d90: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
8da0: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
8db0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
8dc0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
8dd0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
8de0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8df0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
8e00: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8e10: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d  TE_TEXT;.      }
8e20: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
8e30: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    {.        pMem
8e40: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
8e50: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
8e70: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
8e80: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8e90: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_NULL;.      
8ea0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  }.    }..    p->
8eb0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
8ec0: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
8ed0: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  );.    p->rc = S
8ee0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
8ef0: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
8f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8f10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8f20: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
8f30: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
8f40: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
8f50: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
8f60: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
8f70: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
8f80: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
8f90: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
8fa0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
8fb0: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
8fc0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
8fd0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
8fe0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
8ff0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
9000: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
9010: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
9020: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  z!=0 ){.    cons
9030: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
9040: 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65  >p4.z;.    while
9050: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
9060: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
9070: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
9080: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
9090: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
90a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
90b0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
90c0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
90d0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
90e0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
90f0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
9100: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
9110: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9120: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
9130: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
9140: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
9150: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
9160: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
9170: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9180: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
9190: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
91a0: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
91b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
91c0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
91d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
91e0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
91f0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
9200: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
9210: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
9220: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
9230: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
9240: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
9250: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
9260: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
9270: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
9280: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
9290: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
92a0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
92b0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
92c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
92d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
92e0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
92f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9300: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
9310: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
9320: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
9330: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
9340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9350: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
9360: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
9370: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
9380: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
9390: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
93a0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
93b0: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
93c0: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
93d0: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
93e0: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
93f0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
9400: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
9410: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
9420: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
9430: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
9440: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
9450: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
9460: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
9470: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
9480: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
9490: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
94a0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
94b0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
94c0: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
94d0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
94e0: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
94f0: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
9500: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
9510: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
9520: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
9530: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
9540: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
9550: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
9560: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
9570: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9580: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
9590: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
95a0: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
95b0: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
95c0: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
95d0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
95e0: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
95f0: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
9600: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
9610: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
9620: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
9630: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
9640: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
9650: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
9660: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
9670: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
9680: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
9690: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
96a0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
96b0: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
96c0: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
96d0: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
96e0: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
96f0: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
9700: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
9710: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
9720: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
9730: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
9740: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
9750: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
9760: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
9770: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
9780: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
9790: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
97a0: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
97b0: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
97c0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
97d0: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
97e0: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
97f0: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
9800: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9810: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
9820: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
9830: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
9840: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
9850: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
9860: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
9870: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
9880: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
9890: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
98a0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
98b0: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
98c0: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
98d0: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
98e0: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
98f0: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
9900: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
9910: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
9920: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
9930: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
9940: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
9950: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
9960: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
9970: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
9980: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
9990: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
99a0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
99b0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
99c0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
99d0: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
99e0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
99f0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
9a00: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
9a10: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
9a20: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
9a30: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
9a40: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
9a50: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
9a60: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
9a70: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
9a80: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
9a90: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
9aa0: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
9ab0: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20  AGIC_RUN..**.** 
9ac0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
9ad0: 79 20 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65  y be called more
9ae0: 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20   than once on a 
9af0: 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d  single virtual m
9b00: 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66  achine..** The f
9b10: 69 72 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64  irst call is mad
9b20: 65 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e  e while compilin
9b30: 67 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  g the SQL statem
9b40: 65 6e 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a  ent. Subsequent.
9b50: 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  ** calls are mad
9b60: 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  e as part of the
9b70: 20 70 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65   process of rese
9b80: 74 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e  tting a statemen
9b90: 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78  t to be.** re-ex
9ba0: 65 63 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63  ecuted (from a c
9bb0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  all to sqlite3_r
9bc0: 65 73 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61  eset()). The nVa
9bd0: 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72  r, nMem, nCursor
9be0: 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61   .** and isExpla
9bf0: 69 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  in parameters ar
9c00: 65 20 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f  e only passed co
9c10: 72 72 65 63 74 20 76 61 6c 75 65 73 20 74 68 65  rrect values the
9c20: 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74   first time.** t
9c30: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  he function is c
9c40: 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71  alled. On subseq
9c50: 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d  uent calls, from
9c60: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
9c70: 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73  , nVar.** is pas
9c80: 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c  sed -1 and nMem,
9c90: 20 6e 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45   nCursor and isE
9ca0: 78 70 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70  xplain are all p
9cb0: 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76  assed zero..*/.v
9cc0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
9cd0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
9ce0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9d00: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
9d10: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
9d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9d30: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
9d40: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
9d50: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
9d60: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
9d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9d80: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
9d90: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
9da0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9dd0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
9de0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ate */.  int nAr
9df0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
9e00: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
9e10: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
9e20: 73 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 73  s in SubPrograms
9e30: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
9e40: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
9e50: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
9e60: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
9e70: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
9e80: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73 53 74 6d  */.  int usesStm
9e90: 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20  tJournal        
9ea0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
9eb0: 65 74 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74  et Vdbe.usesStmt
9ec0: 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20  Journal */.){.  
9ed0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
9ee0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
9ef0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
9f00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
9f10: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
9f20: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
9f30: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
9f40: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
9f50: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9f60: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
9f70: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
9f80: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
9f90: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
9fa0: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
9fb0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
9fc0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
9fd0: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
9fe0: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
9ff0: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
a000: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
a010: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
a020: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
a030: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
a040: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
a050: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
a060: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
a070: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
a080: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
a090: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
a0a0: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
a0b0: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
a0c0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
a0d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a0e0: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
a0f0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
a100: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
a110: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
a120: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
a130: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
a140: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
a150: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
a160: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
a170: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
a180: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
a190: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
a1a0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
a1b0: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
a1c0: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
a1d0: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
a1e0: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
a1f0: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
a200: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
a210: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20  n arguments in. 
a220: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e  This is only don
a230: 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  e the.  ** first
a240: 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74   time this funct
a250: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ion is called fo
a260: 72 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20  r a given VDBE, 
a270: 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20  not when it is. 
a280: 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   ** being called
a290: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
a2a0: 73 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74  set() to reset t
a2b0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a2c0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
a2d0: 56 61 72 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Var>=0 && ALWAYS
a2e0: 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
a2f0: 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75 38 20  d==0) ){.    u8 
a300: 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a 29 26 70  *zCsr = (u8 *)&p
a310: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
a320: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
a330: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
a340: 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 75 38  oation */.    u8
a350: 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29 26   *zEnd = (u8 *)&
a360: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c  p->aOp[p->nOpAll
a370: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
a380: 79 74 65 20 70 61 73 74 20 61 76 61 69 6c 61 62  yte past availab
a390: 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  le mem */.    in
a3a0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3c0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
a3d0: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 6e  h extra memory n
a3e0: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 20 20 72 65  eeded */..    re
a3f0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
a400: 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e   &nArg);.    p->
a410: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a420: 3d 20 28 75 38 29 75 73 65 73 53 74 6d 74 4a 6f  = (u8)usesStmtJo
a430: 75 72 6e 61 6c 3b 0a 20 20 20 20 69 66 28 20 69  urnal;.    if( i
a440: 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  sExplain && nMem
a450: 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65  <10 ){.      nMe
a460: 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  m = 10;.    }.  
a470: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
a480: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
a490: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
a4a0: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20  - (u8*)0)&7;.   
a4b0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a4c0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
a4d0: 73 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  sr) );..    /* M
a4e0: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
a4f0: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
a500: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
a510: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
a520: 6f 0a 20 20 20 20 2a 2a 20 70 61 73 73 65 73 2e  o.    ** passes.
a530: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
a540: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
a550: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
a560: 65 20 61 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  e at the .    **
a570: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
a580: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
a590: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
a5a0: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
a5b0: 79 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  y.    ** require
a5c0: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
a5d0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
a5e0: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
a5f0: 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70   second.    ** p
a600: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
a610: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
a620: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
a630: 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  on.  .    **.   
a640: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
a650: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
a660: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
a670: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
a680: 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  e from.    ** th
a690: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
a6a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
a6b0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
a6c0: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
a6d0: 79 0a 20 20 20 20 2a 2a 20 72 65 64 75 63 65 20  y.    ** reduce 
a6e0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
a6f0: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
a700: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a710: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  t..    */.    do
a720: 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d   {.      nByte =
a730: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65   0;.      p->aMe
a740: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
a750: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
a760: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
a770: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a780: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
a790: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
a7a0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
a7b0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
a7c0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
a7d0: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
a7e0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
a7f0: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
a800: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
a810: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
a820: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
a830: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
a840: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
a850: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
a860: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
a870: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
a880: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
a890: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
a8a0: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
a8d0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a8e0: 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 20        if( nByte 
a8f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 46  ){.        p->pF
a900: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
a910: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
a920: 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  yte);.      }.  
a930: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
a940: 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20  ree;.      zEnd 
a950: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
a960: 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74      }while( nByt
a970: 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  e && !db->malloc
a980: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70  Failed );..    p
a990: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36  ->nCursor = (u16
a9a0: 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  )nCursor;.    if
a9b0: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
a9c0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
a9d0: 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 20 20  Var)nVar;.      
a9e0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
a9f0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
aa00: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
aa10: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
aa20: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
aa30: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
aa40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
aa50: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70  >aMem ){.      p
aa60: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa80: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
aa90: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
aaa0: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
aab0: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
aac0: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
aad0: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
aae0: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31  */.      for(n=1
aaf0: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
ab00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
ab10: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
ab20: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
ab30: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
ab40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ab50: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
ab60: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d  E_DEBUG.  for(n=
ab70: 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  1; n<p->nMem; n+
ab80: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
ab90: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64  p->aMem[n].db==d
aba0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
abb0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
abc0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
abd0: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
abe0: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
abf0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
ac00: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
ac10: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
ac20: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
ac30: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
ac40: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
ac50: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
ac60: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
ac70: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
ac80: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
ac90: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
aca0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
acb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
acc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
acd0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
ace0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
acf0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  0;.      p->aOp[
ad00: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
ad10: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
ad20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ad30: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
ad40: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
ad50: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
ad60: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
ad70: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
ad80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
ad90: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
ada0: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
adb0: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
adc0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
add0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
ade0: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
adf0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
ae00: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
ae10: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
ae20: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
ae30: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
ae40: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
ae50: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
ae60: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
ae70: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
ae80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
ae90: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
aea0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
aeb0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
aec0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
aed0: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
aee0: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
aef0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
af00: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
af10: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
af20: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
af30: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
af40: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e  *pModule = pCx->
af50: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
af60: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
af70: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
af80: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
af90: 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  r);.    p->inVta
afa0: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
afb0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
afc0: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
afd0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
afe0: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
aff0: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
b000: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
b010: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
b020: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
b030: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
b040: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
b050: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
b060: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
b070: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
b080: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
b090: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
b0a0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
b0b0: 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70  ame->v;.  v->aOp
b0c0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
b0d0: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
b0e0: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
b0f0: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
b100: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
b110: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
b120: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
b130: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
b140: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
b150: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
b160: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
b170: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
b180: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
b190: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
b1a0: 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
b1b0: 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
b1c0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
b1d0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
b1e0: 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
b1f0: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
b200: 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
b210: 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
b220: 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
b230: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
b240: 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
b250: 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
b260: 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
b270: 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
b280: 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
b290: 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
b2a0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
b2b0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
b2c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
b2d0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
b2e0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
b2f0: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
b300: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20  beFrame *pFrame 
b310: 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20  = p->pFrame;.   
b320: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
b330: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
b340: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
b350: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
b360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b370: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
b380: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
b390: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
b3a0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
b3b0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
b3c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
b3d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
b3e0: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
b3f0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
b400: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
b410: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
b420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b430: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
b440: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
b450: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
b460: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b470: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
b480: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
b490: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
b4a0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
b4b0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
b4c0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
b4d0: 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
b4e0: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
b4f0: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
b500: 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
b510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
b520: 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
b530: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
b540: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
b550: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
b560: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b570: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
b580: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
b590: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
b5a0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
b5b0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
b5c0: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
b5d0: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
b5e0: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
b5f0: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
b600: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
b610: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
b620: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
b630: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
b640: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b650: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
b660: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
b670: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
b680: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
b690: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
b6a0: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
b6b0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b6c0: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
b6d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   */.  int i;.  f
b6e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
b6f0: 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  rsor; i++) asser
b700: 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c  t( p->apCsr==0 |
b710: 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  | p->apCsr[i]==0
b720: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
b730: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  <=p->nMem; i++) 
b740: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d  assert( p->aMem=
b750: 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d  =0 || p->aMem[i]
b760: 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c  .flags==MEM_Null
b770: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   );.#endif..  sq
b780: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b790: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
b7a0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
b7b0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
b7c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
b7d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b7e0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
b7f0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
b800: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
b810: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
b820: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
b830: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
b840: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
b850: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
b860: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
b870: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
b880: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
b890: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
b8a0: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
b8b0: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
b8c0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
b8d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b8e0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
b8f0: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
b900: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
b910: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
b920: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b930: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
b940: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
b950: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
b960: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
b970: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
b980: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
b990: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
b9a0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
b9b0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
b9c0: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
b9d0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
b9e0: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
b9f0: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
ba00: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
ba10: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
ba20: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
ba30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
ba40: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
ba50: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
ba60: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
ba70: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
ba80: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
ba90: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
baa0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
bab0: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
bac0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
bad0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
bae0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
baf0: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
bb00: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
bb10: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
bb20: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
bb30: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
bb40: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
bb50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
bb60: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
bb70: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
bb80: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
bb90: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
bba0: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
bbb0: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
bbc0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
bbd0: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
bbe0: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
bbf0: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
bc00: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
bc10: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
bc20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
bc30: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
bc40: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
bc50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
bc60: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
bc70: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bc90: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
bca0: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
bcb0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bcd0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
bce0: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
bcf0: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
bd20: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
bd30: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
bd40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
bd70: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
bd80: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
bd90: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
bda0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
bdb0: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
bdc0: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
bdd0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
bde0: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
bdf0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
be00: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
be10: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
be20: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
be30: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
be40: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
be50: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
be60: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
be70: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
be80: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
be90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
bea0: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
beb0: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
bec0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
bed0: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
bee0: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
bef0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
bf00: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
bf10: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
bf20: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
bf30: 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
bf40: 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
bf50: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
bf60: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
bf70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
bf80: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
bf90: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
bfa0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
bfb0: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
bfc0: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
bfd0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
bfe0: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
bff0: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
c000: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
c010: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
c020: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
c030: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
c040: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
c050: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
c060: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
c070: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
c080: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
c090: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
c0a0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
c0b0: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
c0c0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
c0d0: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
c0e0: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
c0f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
c100: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c110: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
c120: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
c130: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c140: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
c150: 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
c160: 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
c170: 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
c180: 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
c190: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
c1a0: 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
c1b0: 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
c1c0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
c1d0: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
c1e0: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
c1f0: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
c200: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
c210: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
c220: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
c230: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
c240: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
c250: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
c260: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
c270: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
c280: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
c290: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
c2a0: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
c2b0: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
c2c0: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
c2d0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
c2e0: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
c2f0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
c300: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
c310: 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45  bSync(db, &p->zE
c320: 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  rrMsg);..  /* Th
c330: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
c340: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
c350: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
c360: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
c370: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
c380: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
c390: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
c3a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
c3b0: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
c3c0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
c3d0: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
c3e0: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
c3f0: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
c400: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
c410: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
c420: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
c430: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
c440: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
c450: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
c460: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
c470: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
c480: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c490: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
c4a0: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
c4b0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
c4c0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
c4d0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
c4e0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
c4f0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
c500: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
c510: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
c520: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
c530: 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
c540: 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  k(sqlite3BtreePa
c550: 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  ger(pBt));.    }
c560: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
c570: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c580: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
c590: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
c5a0: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
c5b0: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
c5c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
c5d0: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
c5e0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
c5f0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
c600: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
c610: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
c620: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
c630: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
c640: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c650: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c660: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
c670: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
c680: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
c690: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
c6a0: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
c6b0: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
c6c0: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
c6d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
c6e0: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
c6f0: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
c700: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
c710: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
c720: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
c730: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
c740: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
c750: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
c760: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
c770: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
c780: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
c790: 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
c7a0: 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
c7b0: 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
c7c0: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
c7d0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
c7e0: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
c7f0: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
c800: 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
c810: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
c820: 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
c830: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
c840: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
c850: 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
c860: 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
c870: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
c880: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
c890: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
c8a0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
c8b0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
c8c0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
c8d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
c8e0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
c8f0: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
c900: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
c910: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
c920: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
c930: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
c940: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
c950: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
c960: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
c970: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
c980: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
c990: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
c9a0: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
c9b0: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
c9c0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
c9d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
c9e0: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
c9f0: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
ca00: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
ca10: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
ca20: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
ca30: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
ca40: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
ca50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ca60: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ca70: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
ca80: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
ca90: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
caa0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
cab0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
cac0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
cad0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
cae0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
caf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
cb00: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
cb10: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
cb20: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
cb30: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
cb40: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
cb50: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
cb60: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
cb70: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
cb80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cb90: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
cba0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
cbb0: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
cbc0: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
cbd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cbe0: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
cbf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
cc00: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
cc10: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
cc20: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
cc30: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
cc40: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
cc50: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
cc60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
cc70: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
cc80: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
cc90: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
cca0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
ccb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
ccc0: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
ccd0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
cce0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a  ;.    int res;..
ccf0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
cd00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cd10: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
cd20: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
cd30: 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71  Random;.      sq
cd40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
cd50: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
cd60: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
cd70: 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
cd80: 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
cd90: 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73       zMaster = s
cda0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
cdb0: 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a  , "%s-mj%08X", z
cdc0: 4d 61 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f  MainFile, iRando
cdd0: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
cde0: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
cdf0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
ce00: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ce10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ce20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
ce30: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
ce40: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
ce50: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
ce60: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
ce70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
ce80: 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
ce90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cea0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
ceb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
cec0: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
ced0: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
cee0: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
cef0: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
cf00: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
cf10: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
cf20: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
cf30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
cf40: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
cf50: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
cf60: 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
cf70: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
cf80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cf90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
cfa0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
cfb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
cfc0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
cfd0: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
cfe0: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
cff0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
d000: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
d010: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
d020: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
d030: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
d040: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
d050: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
d060: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
d070: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
d080: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
d090: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
d0a0: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
d0b0: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
d0c0: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
d0d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
d0e0: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
d0f0: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
d100: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
d110: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
d120: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
d130: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
d140: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
d150: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
d160: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
d170: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
d180: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
d190: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
d1a0: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
d1b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
d1c0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
d1d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
d1e0: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
d1f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
d200: 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
d210: 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
d220: 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
d230: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
d240: 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
d250: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
d260: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
d270: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
d280: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
d290: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
d2a0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
d2b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d2c0: 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
d2d0: 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
d2e0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
d2f0: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
d300: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
d310: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
d320: 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
d330: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d340: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
d350: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
d360: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
d370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
d380: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
d390: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
d3a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d3b0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
d3c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d3d0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
d3e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d3f0: 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
d400: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d410: 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
d420: 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
d430: 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
d440: 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
d450: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
d460: 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
d470: 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  nc .     && 0==(
d480: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
d490: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
d4a0: 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
d4b0: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
d4c0: 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
d4d0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d4e0: 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
d4f0: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
d500: 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
d510: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
d520: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
d530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
d540: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
d550: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
d560: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d570: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
d580: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d590: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
d5a0: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
d5b0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
d5c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
d5d0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
d5e0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
d5f0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
d600: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
d610: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
d620: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
d630: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
d640: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
d650: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d660: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
d670: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
d680: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
d690: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
d6a0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
d6b0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
d6c0: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
d6d0: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
d6e0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
d6f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d700: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
d710: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
d720: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
d730: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
d740: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d750: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
d760: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
d770: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
d780: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
d790: 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
d7a0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
d7b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d7c0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
d7d0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
d7e0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d7f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d800: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d810: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d820: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
d830: 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
d840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d850: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
d860: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
d870: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d880: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
d890: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d8a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
d8b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
d8c0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
d8d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
d8e0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
d8f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d900: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
d910: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
d920: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
d930: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
d940: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
d950: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
d960: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
d970: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
d980: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
d990: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
d9a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d9b0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
d9c0: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
d9d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d9e0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
d9f0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
da00: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
da10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
da20: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
da30: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
da40: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
da50: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
da60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
da70: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
da80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
da90: 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
daa0: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
dab0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
dac0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
dad0: 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
dae0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
daf0: 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
db00: 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
db10: 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
db20: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
db30: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
db40: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
db50: 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
db60: 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
db70: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
db80: 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
db90: 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
dba0: 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
dbb0: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
dbc0: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
dbd0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
dbe0: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
dbf0: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
dc00: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
dc10: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
dc20: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
dc30: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
dc40: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
dc50: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
dc60: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
dc70: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
dc80: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
dc90: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
dca0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
dcb0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
dcc0: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
dcd0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
dce0: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
dcf0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
dd00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
dd10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
dd20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
dd30: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
dd40: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
dd50: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
dd60: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
dd70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
dd80: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
dd90: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
dda0: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
ddb0: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
ddc0: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
ddd0: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
dde0: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
ddf0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
de00: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
de10: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
de20: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
de30: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
de40: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
de50: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
de60: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
de70: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
de80: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
de90: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
dea0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
deb0: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
dec0: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
ded0: 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d  Write = 0;.  p =
dee0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
def0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
df00: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
df10: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
df20: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
df30: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
df40: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
df50: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
df60: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
df70: 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
df80: 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76  ( cnt==db->activ
df90: 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73  eVdbeCnt );.  as
dfa0: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
dfb0: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
dfc0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
dfd0: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
dfe0: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
dff0: 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  /*.** For every 
e000: 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61  Btree that in da
e010: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e020: 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68  n db which .** h
e030: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
e040: 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61  , "trip" or inva
e050: 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73  lidate each curs
e060: 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74  or in.** that Bt
e070: 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  ree might have b
e080: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
e090: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
e0a0: 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  ** can never be 
e0b0: 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69  used again.  Thi
e0c0: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
e0d0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63   rollback.*** oc
e0e0: 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74  curs.  We have t
e0f0: 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f  o trip all the o
e100: 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76  ther cursors, ev
e110: 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f  en.** cursor fro
e120: 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64  m other VMs in d
e130: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
e140: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a  e connections,.*
e150: 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f  * so that none o
e160: 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73  f them try to us
e170: 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68  e the data at wh
e180: 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65  ich they.** were
e190: 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68   pointing and wh
e1a0: 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65  ich now may have
e1b0: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75   been changed du
e1c0: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c  e.** to the roll
e1d0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65  back..**.** Reme
e1e0: 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c  mber that a roll
e1f0: 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20  back can delete 
e200: 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20  tables complete 
e210: 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72  and.** reorder r
e220: 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74  ootpages.  So it
e230: 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
e240: 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a  nt just to save.
e250: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ** the state of 
e260: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20  the cursor.  We 
e270: 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61  have to invalida
e280: 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  te the cursor.**
e290: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
e2a0: 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e  ever used again.
e2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e2c0: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
e2d0: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
e2e0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
e2f0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
e300: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
e310: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
e320: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
e330: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26  Bt;.    if( p &&
e340: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
e350: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
e360: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
e370: 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
e380: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a   SQLITE_ABORT);.
e390: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
e3a0: 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
e3b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
e3c0: 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
e3d0: 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
e3e0: 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
e3f0: 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
e400: 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
e410: 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
e420: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
e430: 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
e440: 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
e450: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
e460: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
e470: 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
e480: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
e490: 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
e4a0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
e4b0: 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
e4c0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
e4d0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e  ion is commtted.
e4e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
e4f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
e500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
e510: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
e520: 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
e530: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
e540: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
e550: 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
e560: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ent(Vdbe *p, int
e570: 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33   eOp){.  sqlite3
e580: 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e   *const db = p->
e590: 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
e5a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
e5b0: 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  If p->iStatement
e5c0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
e5d0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
e5e0: 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a   Vdbe opened a .
e5f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
e600: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
e610: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
e620: 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20   here. The only 
e630: 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  exception.  ** i
e640: 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72  s that an IO err
e650: 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75  or may have occu
e660: 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
e670: 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
e680: 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
e690: 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
e6a0: 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
e6b0: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
e6c0: 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
e6d0: 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
e6e0: 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
e6f0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
e700: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
e710: 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
e720: 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
e730: 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
e740: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
e750: 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
e760: 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
e770: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
e780: 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
e790: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
e7a0: 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
e7b0: 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
e7c0: 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
e7d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
e7e0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
e7f0: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
e800: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
e810: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e820: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e830: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e840: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
e850: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
e860: 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
e870: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
e880: 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
e890: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
e8a0: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
e8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e8c0: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
e8d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
e8e0: 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
e8f0: 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
e900: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
e910: 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
e920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e930: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e940: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
e950: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
e960: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e970: 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
e980: 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
e990: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
e9a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
e9b0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
e9c0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
e9d0: 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
e9e0: 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
e9f0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
ea00: 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
ea10: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
ea20: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
ea30: 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
ea40: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
ea50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
ea60: 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
ea70: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
ea80: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
ea90: 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
eaa0: 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
eab0: 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  tDefCons;.    }.
eac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ead0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
eae0: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
eaf0: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
eb00: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
eb10: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
eb20: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
eb30: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
eb40: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
eb50: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
eb60: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
eb70: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
eb80: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
eb90: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
eba0: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
ebb0: 6f 20 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65  o it.** sets the
ebc0: 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d   BtShared.db mem
ebd0: 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74  ber of each of t
ebe0: 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
ebf0: 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67  ctures, ensuring
ec00: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72  .** that the cor
ec10: 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65  rect busy-handle
ec20: 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  r callback is in
ec30: 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65  voked if require
ec40: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  d..**.** If SQLi
ec50: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
ec60: 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75  safe but does su
ec70: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
ec80: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a  he mode, then.**
ec90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
eca0: 65 72 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b  erAll() is invok
ecb0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
ecc0: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
ecd0: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
ece0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
ecf0: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
ed00: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
ed10: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
ed20: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
ed30: 56 4d 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e  VM. Of course on
ed40: 6c 79 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ly a subset of t
ed50: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 0a  hese structures.
ed60: 2a 2a 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73  ** will be acces
ed70: 73 65 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61  sed by the VM, a
ed80: 6e 64 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20  nd we could use 
ed90: 56 64 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74  Vdbe.btreeMask t
eda0: 6f 20 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74  o figure.** that
edb0: 20 73 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74   subset out, but
edc0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76   there is no adv
edd0: 61 6e 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20  antage to doing 
ede0: 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  so..**.** If SQL
edf0: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
ee00: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
ee10: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
ee20: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
ee30: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
ee40: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69  s a no-op..*/.#i
ee50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ee60: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76  T_SHARED_CACHE.v
ee70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
ee80: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 56  utexArrayEnter(V
ee90: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  dbe *p){.#if SQL
eea0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
eeb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
eec0: 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d  exArrayEnter(&p-
eed0: 3e 61 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a  >aMutex);.#else.
eee0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
eef0: 74 65 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23  terAll(p->db);.#
ef00: 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a  endif.}.#endif..
ef10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
ef20: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
ef30: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
ef40: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
ef50: 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
ef60: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
ef70: 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
ef80: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
ef90: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
efa0: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
efb0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
efc0: 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
efd0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
efe0: 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
eff0: 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
f000: 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
f010: 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
f020: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
f030: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
f040: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
f050: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
f060: 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
f070: 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
f080: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
f090: 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
f0a0: 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74  STRAINT and writ
f0b0: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65  e.** an error me
f0c0: 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
f0d0: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
f0e0: 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
f0f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
f100: 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
f110: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
f120: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
f130: 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
f140: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
f150: 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
f160: 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
f170: 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66  Cons>0) || (!def
f180: 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
f190: 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a  onstraint>0) ){.
f1a0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
f1b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
f1c0: 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
f1d0: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
f1e0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
f1f0: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
f200: 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  db, "foreign key
f210: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
f220: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
f230: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
f240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
f250: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
f260: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f270: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
f280: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
f290: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
f2a0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
f2b0: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
f2c0: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
f2d0: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
f2e0: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
f2f0: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
f300: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
f310: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
f320: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
f330: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
f340: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
f350: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
f360: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
f370: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
f380: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
f390: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
f3a0: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
f3b0: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
f3c0: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
f3d0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
f3e0: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
f3f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
f400: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
f410: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
f420: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
f430: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
f440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f450: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
f460: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
f470: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
f480: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
f490: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
f4a0: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
f4b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
f4c0: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
f4d0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
f500: 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
f510: 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
f520: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
f530: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
f540: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
f550: 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
f560: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
f570: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
f580: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
f590: 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
f5a0: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
f5b0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
f5c0: 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
f5d0: 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
f5e0: 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
f5f0: 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
f600: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
f610: 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
f620: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
f630: 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
f640: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
f650: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
f660: 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
f670: 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
f680: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
f690: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
f6a0: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
f6b0: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
f6c0: 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
f6d0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
f6e0: 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
f6f0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
f700: 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
f710: 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
f720: 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
f730: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
f740: 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
f750: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
f760: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
f770: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f780: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
f790: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f  NOMEM;.  }.  clo
f7a0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
f7b0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
f7c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
f7d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f7e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
f7f0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
f800: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
f810: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
f820: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
f830: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
f840: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
f850: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
f860: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
f870: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
f880: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
f890: 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
f8a0: 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
f8b0: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f8d0: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
f8e0: 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
f8f0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
f900: 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
f910: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
f920: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f930: 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  dbeMutexArrayEnt
f940: 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
f950: 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
f960: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
f970: 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
f980: 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
f990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
f9a0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
f9b0: 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69  OCKED );  /* Thi
f9c0: 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65  s error no longe
f9d0: 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  r exists */.    
f9e0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
f9f0: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
fa00: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
fa10: 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
fa30: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
fa40: 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
fa50: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
fa60: 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
fa70: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
fa80: 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
fa90: 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
faa0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
fab0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
fac0: 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
fad0: 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
fae0: 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
faf0: 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
fb00: 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
fb10: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
fb20: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
fb30: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
fb40: 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
fb50: 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
fb60: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
fb70: 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
fb80: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
fb90: 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
fba0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
fbb0: 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
fbc0: 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
fbd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
fbe0: 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
fbf0: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
fc00: 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20       ** occured 
fc10: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
fc20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
fc30: 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
fc40: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
fc50: 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
fc60: 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
fc70: 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
fc80: 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
fc90: 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
fca0: 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
fcb0: 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
fcc0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
fcd0: 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
fce0: 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
fcf0: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
fd00: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fd10: 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
fd20: 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
fd30: 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
fd40: 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
fd50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
fd60: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
fd70: 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
fd80: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
fd90: 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
fda0: 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
fdb0: 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
fdc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
fdd0: 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
fde0: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
fdf0: 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
fe00: 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
fe10: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
fe20: 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
fe30: 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
fe40: 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
fe50: 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
fe60: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
fe70: 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
fe80: 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66  teCursorsOnModif
fe90: 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20  iedBtrees(db);. 
fea0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
feb0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
fec0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fed0: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
fee0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
fef0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
ff00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
ff10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
ff20: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69    /* Check for i
ff30: 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
ff40: 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e   key violations.
ff50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
ff60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ff70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff80: 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a  eCheckFk(p, 0);.
ff90: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
ffa0: 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
ffb0: 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
ffc0: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
ffd0: 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65  nly active write
ffe0: 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68  r .    ** VM, th
fff0: 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  en we do either 
10000 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
10010 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
10020 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
10030 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
10040 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
10050 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
10060 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
10070 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
10080 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
10090 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
100a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
100b0 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
100c0 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
100d0 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
100e0 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62   && db->writeVdb
100f0 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  eCnt==(p->readOn
10100 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
10110 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
10120 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
10130 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
10140 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
10150 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
10160 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10170 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
10180 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
10190 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
101a0 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
101b0 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
101c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
101d0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
101e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
101f0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
10200 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
10210 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
10220 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
10230 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
10240 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
10250 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
10260 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
10270 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 2a  oreign.        *
10280 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  * key constraint
10290 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65  s to hold up the
102a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
102b0 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
102c0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
102d0 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20   required.  */. 
102e0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
102f0 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
10300 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
10310 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
10320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
10330 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
10340 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
10350 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
10360 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
10370 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10390 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
103a0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
103b0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
103c0 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
103d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
103e0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
103f0 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
10400 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
10410 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
10420 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
10430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10440 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
10450 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
10460 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
10470 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
10480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
10490 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
104a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
104b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
104c0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
104d0 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
104e0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
104f0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10500 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
10510 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
10520 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
10530 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
10540 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
10550 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
10560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
10570 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
10580 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
10590 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
105a0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
105b0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
105c0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
105d0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
105e0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
105f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10600 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
10610 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
10620 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
10630 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
10640 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
10650 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
10660 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
10670 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
10680 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
10690 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
106a0 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
106b0 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
106c0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
106d0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
106e0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
106f0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
10700 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
10710 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
10720 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
10730 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
10740 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
10750 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
10760 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  te that sqlite3V
10770 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
10780 74 28 29 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69  t() can only fai
10790 6c 20 69 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  l if eStatementO
107a0 70 0a 20 20 20 20 2a 2a 20 69 73 20 53 41 56 45  p.    ** is SAVE
107b0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2e 20  POINT_ROLLBACK. 
107c0 20 42 75 74 20 69 66 20 70 2d 3e 72 63 3d 3d 53   But if p->rc==S
107d0 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 65 53  QLITE_OK then eS
107e0 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a  tatementOp.    *
107f0 2a 20 6d 75 73 74 20 62 65 20 53 41 56 45 50 4f  * must be SAVEPO
10800 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 20 48 65  INT_RELEASE.  He
10810 6e 63 65 20 74 68 65 20 4e 45 56 45 52 28 70 2d  nce the NEVER(p-
10820 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  >rc==SQLITE_OK) 
10830 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  in .    ** the f
10840 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 2e 0a 20  ollowing code.. 
10850 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
10860 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
10870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10880 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
10890 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
108a0 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
108b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  c ){.        ass
108c0 65 72 74 28 20 65 53 74 61 74 65 6d 65 6e 74 4f  ert( eStatementO
108d0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
108e0 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  LBACK );.       
108f0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 63   if( NEVER(p->rc
10900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20  ==SQLITE_OK) || 
10910 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
10920 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
10930 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
10940 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10950 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10960 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
10970 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
10980 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
10990 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
109a0 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
109b0 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
109d0 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
109e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
109f0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
10a00 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
10a10 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
10a20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
10a30 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
10a40 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
10a50 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
10a60 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
10a70 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
10a80 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
10a90 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
10aa0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
10ab0 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
10ac0 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
10ad0 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
10ae0 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
10af0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
10b00 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
10b10 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
10b20 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
10b30 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
10b40 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
10b50 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
10b60 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
10b70 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
10b80 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
10b90 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
10ba0 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
10bb0 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
10bc0 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
10bd0 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
10be0 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
10bf0 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
10c00 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
10c10 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
10c20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
10c30 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
10c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
10c50 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
10c60 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
10c70 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
10c80 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
10c90 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
10ca0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
10cb0 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
10cc0 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
10cd0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
10ce0 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
10cf0 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
10d00 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
10d10 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
10d20 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
10d30 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
10d40 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  nt--;.    if( !p
10d50 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
10d60 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64 62      db->writeVdb
10d70 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  eCnt--;.    }.  
10d80 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63    assert( db->ac
10d90 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d  tiveVdbeCnt>=db-
10da0 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
10db0 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
10dc0 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
10dd0 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
10de0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
10df0 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
10e00 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
10e10 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
10e20 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
10e30 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
10e40 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
10e50 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
10e60 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
10e70 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
10e80 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
10e90 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
10ea0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
10eb0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
10ec0 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
10ed0 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
10ee0 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
10ef0 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
10f00 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
10f10 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
10f20 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
10f30 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
10f40 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69  assert( db->acti
10f50 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64  veVdbeCnt>0 || d
10f60 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
10f70 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
10f80 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
10f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10fa0 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
10fb0 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
10fc0 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
10fd0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
10fe0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
10ff0 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
11000 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
11010 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
11020 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
11030 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
11040 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
11050 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
11060 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11070 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
11080 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
11090 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
110a0 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
110b0 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
110c0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
110d0 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
110e0 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
110f0 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
11100 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
11110 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
11120 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
11130 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
11140 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
11150 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
11160 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
11170 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
11180 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
11190 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
111a0 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
111b0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
111c0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
111d0 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
111e0 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
111f0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
11200 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
11210 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
11220 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
11230 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
11240 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
11250 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
11260 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
11270 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
11280 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
11290 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
112a0 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
112b0 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
112c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
112d0 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
112e0 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
112f0 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
11300 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
11310 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
11320 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
11330 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
11340 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
11350 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
11360 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
11370 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
11380 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
11390 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
113a0 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
113b0 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
113c0 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
113d0 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
113e0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
113f0 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
11400 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
11410 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
11420 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
11430 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
11440 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
11450 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
11460 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
11470 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72  >pErr,-1,p->zErr
11480 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c  Msg,SQLITE_UTF8,
11490 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
114a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
114b0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
114c0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
114d0 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
114e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
114f0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
11500 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  );.      p->zErr
11510 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
11520 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
11530 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11540 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
11550 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11560 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
11570 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
11580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11590 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
115a0 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
115b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
115c0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
115d0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
115e0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
115f0 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
11600 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
11610 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
11620 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
11630 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
11640 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
11650 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
11660 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
11670 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
11680 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
11690 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
116a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
116b0 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
116c0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
116d0 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
116e0 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
116f0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
11700 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11710 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11720 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
11730 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
11740 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
11750 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
11760 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
11770 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
11780 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
11790 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
117a0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
117b0 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
117c0 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
117d0 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
117e0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
117f0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
11800 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
11810 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
11820 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
11830 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
11840 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
11850 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
11860 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
11870 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
11880 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
11890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
118a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
118b0 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
118c0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
118d0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
118e0 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30  tf(out, "%6d %10
118f0 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20  lld %8lld ",.   
11900 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
11910 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
11920 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
11930 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
11940 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
11950 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
11960 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
11970 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
11980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11990 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
119a0 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
119b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
119c0 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
119d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
119e0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
119f0 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
11a00 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
11a10 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
11a20 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
11a30 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
11a40 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
11a50 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
11a60 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
11a70 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
11a80 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
11a90 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
11aa0 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
11ab0 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
11ac0 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
11ad0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11ae0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
11af0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
11b00 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
11b10 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
11b20 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
11b30 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
11b40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11b50 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
11b60 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
11b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
11b80 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
11b90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61   rc;.}../*.** Ca
11ba0 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ll the destructo
11bb0 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61  r for each auxda
11bc0 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62  ta entry in pVdb
11bd0 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a  eFunc for which.
11be0 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ** the correspon
11bf0 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b  ding bit in mask
11c00 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64   is clear.  Auxd
11c10 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f  ata entries beyo
11c20 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77  nd 31.** are alw
11c30 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20  ays destroyed.  
11c40 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61  To destroy all a
11c50 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20  uxdata entries, 
11c60 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  call this.** rou
11c70 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d  tine with mask==
11c80 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
11c90 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
11ca0 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56  ata(VdbeFunc *pV
11cb0 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73  dbeFunc, int mas
11cc0 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  k){.  int i;.  f
11cd0 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46  or(i=0; i<pVdbeF
11ce0 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b  unc->nAux; i++){
11cf0 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44  .    struct AuxD
11d00 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64  ata *pAux = &pVd
11d10 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d  beFunc->apAux[i]
11d20 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20  ;.    if( (i>31 
11d30 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32  || !(mask&(((u32
11d40 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75  )1)<<i))) && pAu
11d50 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
11d60 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
11d70 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
11d80 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
11d90 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
11da0 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
11db0 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
11dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11dd0 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
11de0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
11df0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
11e00 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
11e10 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
11e20 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
11e30 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
11e40 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
11e50 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
11e60 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
11e70 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
11e80 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
11e90 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
11ea0 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
11eb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
11ec0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11ed0 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74  VdbeDeleteObject
11ee0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
11ef0 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
11f00 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
11f10 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  xt;.  assert( p-
11f20 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
11f30 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
11f40 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
11f50 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65  , p->nVar);.  re
11f60 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
11f70 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
11f80 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
11f90 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
11fa0 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
11fb0 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
11fc0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
11fd0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
11fe0 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
11ff0 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
12000 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
12010 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
12020 75 62 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46  ub);.  }.  vdbeF
12030 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
12040 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
12050 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12060 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
12070 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12080 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
12090 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
120a0 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
120b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
120c0 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20  db, p->pFree);. 
120d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
120e0 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
120f0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
12100 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
12110 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12120 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
12130 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
12140 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
12150 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
12160 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  >db;.  if( p->pP
12170 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
12180 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
12190 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
121a0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
121b0 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
121c0 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
121d0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
121e0 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
121f0 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
12200 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
12210 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
12220 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
12230 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c  p->db = 0;.  sql
12240 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62  ite3VdbeDeleteOb
12250 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ject(db, p);.}..
12260 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
12270 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
12280 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
12290 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
122a0 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
122b0 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
122c0 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
122d0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
122e0 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
122f0 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
12300 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
12310 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
12320 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
12330 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
12340 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
12350 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
12360 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
12370 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
12380 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
12390 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
123a0 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
123b0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
123c0 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
123d0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
123e0 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
123f0 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
12400 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
12410 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
12420 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
12430 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
12440 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
12450 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
12460 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
12470 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
12480 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
12490 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
124a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
124b0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
124c0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
124d0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
124e0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
124f0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
12500 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
12510 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
12520 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
12530 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
12540 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
12550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12560 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
12570 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
12580 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
12590 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
125a0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
125b0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
125c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
125d0 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
125e0 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
125f0 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73  get;.    if( res
12600 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
12610 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12620 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73  ;.    p->rowidIs
12630 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65  Valid = 1;.#ifde
12640 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
12650 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
12660 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
12670 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
12680 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
12690 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
126a0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
126b0 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
126c0 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a  (p->pCursor) ){.
126d0 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64      int hasMoved
126e0 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
126f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
12700 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75  rHasMoved(p->pCu
12710 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29  rsor, &hasMoved)
12720 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
12730 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
12740 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20  ( hasMoved ){.  
12750 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
12760 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
12770 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52  ;.      p->nullR
12780 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ow = 1;.    }.  
12790 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
127a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
127b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
127c0 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
127d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
127e0 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
127f0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
12800 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
12810 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
12820 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12830 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
12840 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
12850 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
12860 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
12870 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
12880 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
12890 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
128a0 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
128b0 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
128c0 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
128d0 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
128e0 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
128f0 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
12900 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
12910 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
12920 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
12930 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
12940 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
12950 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
12960 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
12970 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
12980 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
12990 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
129a0 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
129b0 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
129c0 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
129d0 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
129e0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
129f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
12a00 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
12a10 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
12a20 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
12a30 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
12a40 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
12a50 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
12a60 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
12a70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
12a80 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  seperately..**.*
12a90 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
12aa0 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
12ab0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
12ac0 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
12ad0 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
12ae0 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
12af0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
12b00 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
12b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
12b20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
12b30 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
12b40 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
12b70 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
12ba0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
12bb0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
12bd0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
12be0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
12bf0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
12c00 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
12c10 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
12c20 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
12c50 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
12c60 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
12c70 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
12c80 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
12c90 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
12cc0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
12cd0 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
12cf0 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
12d00 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
12d30 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
12d40 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
12d70 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
12d80 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
12db0 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
12dc0 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
12dd0 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
12de0 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
12df0 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
12e00 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
12e10 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
12e20 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
12e30 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
12e40 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
12e50 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
12e60 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
12e70 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
12e80 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
12e90 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
12ea0 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
12eb0 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
12ec0 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
12ed0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
12ee0 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
12ef0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
12f00 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
12f10 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
12f20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
12f30 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e  ->flags;.  int n
12f40 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
12f50 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
12f60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
12f70 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
12f80 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
12f90 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
12fa0 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
12fb0 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
12fc0 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
12fd0 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
12fe0 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
12ff0 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
13000 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
13010 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66  ;.    if( file_f
13020 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31  ormat>=4 && (i&1
13030 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65  )==i ){.      re
13040 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20  turn 8+(u32)i;. 
13050 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30     }.    u = i<0
13060 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69   ? -i : i;.    i
13070 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75  f( u<=127 ) retu
13080 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 1;.    if( u<
13090 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20  =32767 ) return 
130a0 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33  2;.    if( u<=83
130b0 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33  88607 ) return 3
130c0 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  ;.    if( u<=214
130d0 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e  7483647 ) return
130e0 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d   4;.    if( u<=M
130f0 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72  AX_6BYTE ) retur
13100 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 5;.    return 
13110 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
13120 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
13130 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
13140 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
13150 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
13160 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f  d || flags&(MEM_
13170 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b  Str|MEM_Blob) );
13180 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a  .  n = pMem->n;.
13190 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
131a0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
131b0 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
131c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
131d0 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  n>=0 );.  return
131e0 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
131f0 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
13200 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  =0));.}../*.** R
13210 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
13220 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
13230 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
13240 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
13250 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
13260 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13270 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
13280 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
13290 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
132a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
132b0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
132c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
132d0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
132e0 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c  Size[] = { 0, 1,
132f0 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20   2, 3, 4, 6, 8, 
13300 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  8, 0, 0, 0, 0 };
13310 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a  .    return aSiz
13320 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  e[serial_type];.
13330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
13340 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
13350 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
13360 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
13370 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
13380 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
13390 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
133a0 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
133b0 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
133c0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
133d0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
133e0 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
133f0 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
13400 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
13410 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
13420 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
13430 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
13440 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
13450 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
13460 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
13470 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
13480 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
13490 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
134a0 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
134b0 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
134c0 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
134d0 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
134e0 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
134f0 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
13500 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
13510 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
13520 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
13530 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
13540 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
13550 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
13560 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
13570 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
13580 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
13590 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
135a0 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
135b0 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
135c0 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
135d0 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
135e0 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
135f0 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
13600 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
13610 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
13620 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
13630 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
13640 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
13650 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
13660 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
13670 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
13680 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
13690 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
136a0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
136b0 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
136c0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
136d0 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
136e0 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
136f0 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
13700 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
13710 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
13720 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
13730 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
13740 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
13750 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
13760 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
13770 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
13780 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
13790 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
137a0 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
137b0 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
137c0 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
137d0 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
137e0 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
137f0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
13800 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
13810 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
13820 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
13830 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
13840 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
13850 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
13860 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
13870 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
13880 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
13890 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
138a0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
138b0 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
138c0 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
138d0 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
138e0 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
138f0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
13900 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
13910 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
13920 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
13930 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
13940 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
13950 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
13960 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
13970 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
13980 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
13990 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
139a0 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
139b0 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
139c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
139d0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
139e0 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
139f0 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
13a00 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
13a10 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
13a20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
13a30 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
13a40 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
13a50 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
13a60 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
13a70 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
13a80 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
13a90 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
13aa0 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
13ab0 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
13ac0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
13ad0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
13ae0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
13af0 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
13b00 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
13b10 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
13b20 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
13b30 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
13b40 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
13b50 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
13b60 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
13b70 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
13b80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
13b90 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
13ba0 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
13bb0 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
13bc0 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e  eft in buf[].  n
13bd0 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20  Buf must always 
13be0 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75  be.** large enou
13bf0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  gh to hold the e
13c00 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78  ntire field.  Ex
13c10 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65  cept, if the fie
13c20 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20  ld is.** a blob 
13c30 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c  with a zero-fill
13c40 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75  ed tail, then bu
13c50 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73  f[] might be jus
13c60 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73  t the right.** s
13c70 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72  ize to hold ever
13c80 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f  ything except fo
13c90 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  r the zero-fille
13ca0 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b  d tail.  If buf[
13cb0 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67  ].** is only big
13cc0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
13cd0 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65  the non-zero pre
13ce0 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77  fix, then only w
13cf0 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65  rite that.** pre
13d00 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  fix into buf[]. 
13d10 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73   But if buf[] is
13d20 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
13d30 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a   hold both the.*
13d40 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65  * prefix and the
13d50 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65   tail then write
13d60 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20   the prefix and 
13d70 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20  set the tail to 
13d80 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a  all.** zeros..**
13d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
13da0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
13db0 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
13dc0 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
13dd0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
13de0 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
13df0 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
13e00 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
13e10 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
13e20 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
13e30 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
13e40 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32  n buf[]..*/ .u32
13e50 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13e60 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69  alPut(u8 *buf, i
13e70 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d  nt nBuf, Mem *pM
13e80 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
13e90 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69  mat){.  u32 seri
13ea0 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
13eb0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
13ec0 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61  pMem, file_forma
13ed0 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a  t);.  u32 len;..
13ee0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
13ef0 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
13f00 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
13f10 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
13f20 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
13f30 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20   u32 i;.    if( 
13f40 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
13f50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13f60 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
13f70 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20  f(pMem->r) );.  
13f80 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26      memcpy(&v, &
13f90 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28  pMem->r, sizeof(
13fa0 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
13fb0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
13fc0 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
13fd0 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
13fe0 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
13ff0 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
14000 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
14010 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
14020 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d     assert( len<=
14030 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20 20  (u32)nBuf );.   
14040 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20   while( i-- ){. 
14050 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75       buf[i] = (u
14060 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
14070 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
14080 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
14090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
140a0 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
140b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
140c0 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
140d0 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
140e0 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
140f0 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
14100 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
14110 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
14120 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14130 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
14140 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
14150 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29   pMem->n<=nBuf )
14160 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
14170 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ->n;.    memcpy(
14180 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
14190 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d  n);.    if( pMem
141a0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
141b0 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20  ro ){.      len 
141c0 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
141d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
141e0 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20  nBuf>=0 );.     
141f0 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32 29   if( len > (u32)
14200 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
14210 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66 3b  len = (u32)nBuf;
14220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
14230 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
14240 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
14250 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
14260 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
14270 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
14280 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
14290 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
142a0 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
142b0 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
142c0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
142d0 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
142e0 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
142f0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
14300 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
14310 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
14320 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
14330 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
14340 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
14350 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
14360 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
14370 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
14380 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
14390 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
143a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
143b0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
143c0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
143d0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
14400 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
14410 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
14420 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
14430 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
14440 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
14450 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
14460 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
14470 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
14480 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
14490 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
144a0 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
144b0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
144c0 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
144d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
144e0 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
144f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
14500 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
14510 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
14520 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
14530 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
14540 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
14550 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
14560 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
14570 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
14580 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
14590 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
145a0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
145b0 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
145c0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
145d0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
145e0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
145f0 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
14600 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
14610 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
14620 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
14630 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
14640 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
14650 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
14660 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14670 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14680 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
14690 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
146a0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
146b0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
146c0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
146d0 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
146e0 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
146f0 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
14700 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
14710 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
14720 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
14730 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
14740 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
14750 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
14760 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
14770 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
14780 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
14790 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
147a0 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
147b0 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
147c0 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
147d0 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
147e0 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
147f0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
14800 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
14810 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
14820 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
14830 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
14840 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
14850 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
14860 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
14870 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
14880 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
14890 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
148a0 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
148b0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
148c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
148d0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
148e0 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
148f0 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
14900 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
14910 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
14920 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
14930 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
14940 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
14950 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
14960 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
14970 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
14980 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
14990 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
149a0 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
149b0 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
149c0 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
149d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
149e0 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
149f0 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
14a00 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
14a10 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
14a20 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32  .0;.      u64 t2
14a30 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61   = t1;.      swa
14a40 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
14a50 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(t2);.      ass
14a60 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
14a70 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
14a80 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
14a90 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
14aa0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
14ab0 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
14ac0 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
14ad0 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
14ae0 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
14af0 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
14b00 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
14b10 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
14b20 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
14b30 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
14b40 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
14b50 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
14b60 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
14b70 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
14b80 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14b90 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
14ba0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
14bb0 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
14bc0 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
14bd0 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
14be0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
14bf0 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
14c00 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
14c10 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
14c20 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
14c30 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
14c40 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20  3IsNaN(pMem->r) 
14c50 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
14c60 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Real;.      }. 
14c70 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20       return 8;. 
14c80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
14c90 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
14ca0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
14cb0 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
14cc0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
14cd0 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
14ce0 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
14cf0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
14d00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
14d10 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
14d20 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20  lt: {.      u32 
14d30 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  len = (serial_ty
14d40 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
14d50 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
14d60 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
14d70 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  m->n = len;.    
14d80 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30    pMem->xDel = 0
14d90 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
14da0 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a  al_type&0x01 ){.
14db0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
14dc0 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20  ags = MEM_Str | 
14dd0 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
14de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14df0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14e00 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68  M_Blob | MEM_Eph
14e10 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
14e20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
14e30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14e40 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69   0;.}.../*.** Gi
14e50 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
14e60 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
14e70 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
14e80 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72  , parse the.** r
14e90 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70  ecord into a Unp
14ea0 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
14eb0 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61  cture.  Return a
14ec0 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74   pointer to.** t
14ed0 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  hat structure..*
14ee0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
14ef0 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20   function might 
14f00 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20  provide szSpace 
14f10 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
14f20 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61  ** space at pSpa
14f30 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20  ce.  This space 
14f40 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68  can be used to h
14f50 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
14f60 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65  .** VDbeParsedRe
14f70 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
14f80 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e  f it is large en
14f90 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a  ough.  If it is.
14fa0 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67  ** not big enoug
14fb0 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61  h, space is obta
14fc0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
14fd0 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3_malloc()..**.*
14fe0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73  * The returned s
14ff0 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
15000 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63  be closed by a c
15010 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  all to.** sqlite
15020 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
15030 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20  kedRecord()..*/ 
15040 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
15050 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  *sqlite3VdbeReco
15060 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49  rdUnpack(.  KeyI
15070 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
15080 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
15090 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f  n about the reco
150a0 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69  rd format */.  i
150b0 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
150c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
150d0 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   the binary reco
150e0 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
150f0 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
15100 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63  * The binary rec
15110 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ord */.  char *p
15120 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
15130 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
15140 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ce available to 
15150 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74 20  hold the object 
15160 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65  */.  int szSpace
15170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15180 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20  ize of pSpace[] 
15190 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
151a0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
151b0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
151c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
151d0 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61  r *)pKey;.  Unpa
151e0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20  ckedRecord *p;  
151f0 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20  /* The unpacked 
15200 72 65 63 6f 72 64 20 74 68 61 74 20 77 65 20 77  record that we w
15210 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  ill return */.  
15220 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
15230 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70      /* Memory sp
15240 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ace needed to ho
15250 6c 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20 2a  ld p, in bytes *
15260 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33 32  /.  int d;.  u32
15270 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20   idx;.  u16 u;  
15280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
15290 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
152a0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
152b0 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
152c0 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20  ;.  int nOff;   
152d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
152e0 61 73 65 20 70 53 70 61 63 65 20 62 79 20 74 68  ase pSpace by th
152f0 69 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79 74  is much to 8-byt
15300 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20  e align it */.  
15310 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77 61  .  /*.  ** We wa
15320 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20  nt to shift the 
15330 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75  pointer pSpace u
15340 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  p such that it i
15350 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 8-byte aligned
15360 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20  ..  ** Thus, we 
15370 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  need to calculat
15380 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c  e a value, nOff,
15390 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37   between 0 and 7
153a0 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a  , to shift .  **
153b0 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61   it by.  If pSpa
153c0 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d  ce is already 8-
153d0 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f  byte aligned, nO
153e0 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  ff should be zer
153f0 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d  o..  */.  nOff =
15400 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54   (8 - (SQLITE_PT
15410 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29  R_TO_INT(pSpace)
15420 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 70 53   & 7)) & 7;.  pS
15430 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20  pace += nOff;.  
15440 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66 3b  szSpace -= nOff;
15450 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
15460 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
15470 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
15480 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
15490 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
154a0 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
154b0 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  e ){.    p = sql
154c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
154d0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
154e0 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  yte);.    if( p=
154f0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
15500 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
15510 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45  PACKED_NEED_FREE
15520 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   | UNPACKED_NEED
15530 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73  _DESTROY;.  }els
15540 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  e{.    p = (Unpa
15550 63 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70 61  ckedRecord*)pSpa
15560 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  ce;.    p->flags
15570 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   = UNPACKED_NEED
15580 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20  _DESTROY;.  }.  
15590 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
155a0 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
155b0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
155c0 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d  nField + 1;.  p-
155d0 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28  >aMem = pMem = (
155e0 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
155f0 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
15600 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
15610 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
15620 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
15630 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
15640 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
15650 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
15660 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
15670 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
15680 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69  zHdr && u<p->nFi
15690 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  eld && d<=nKey )
156a0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
156b0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
156c0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
156d0 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
156e0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
156f0 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
15700 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
15710 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
15720 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  >db;.    pMem->f
15730 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d  lags = 0;.    pM
15740 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  em->zMalloc = 0;
15750 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
15760 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
15770 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
15780 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
15790 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b   pMem++;.    u++
157a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
157b0 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
157c0 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
157d0 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65  nField = u;.  re
157e0 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d  turn (void*)p;.}
157f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15800 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20  tine destroys a 
15810 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f  UnpackedRecord o
15820 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
15830 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
15840 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55  UnpackedRecord(U
15850 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
15860 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
15870 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  m *pMem;..  asse
15880 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
15890 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 20 26  sert( p->flags &
158a0 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44   UNPACKED_NEED_D
158b0 45 53 54 52 4f 59 20 29 3b 0a 20 20 66 6f 72 28  ESTROY );.  for(
158c0 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65  i=0, pMem=p->aMe
158d0 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20  m; i<p->nField; 
158e0 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  i++, pMem++){.  
158f0 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65    /* The unpacke
15900 64 20 72 65 63 6f 72 64 20 69 73 20 61 6c 77 61  d record is alwa
15910 79 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ys constructed b
15920 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  y the.    ** sql
15930 69 74 65 33 56 64 62 65 55 6e 70 61 63 6b 52 65  ite3VdbeUnpackRe
15940 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  cord() function 
15950 61 62 6f 76 65 2c 20 77 68 69 63 68 20 6d 61 6b  above, which mak
15960 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74  es all.    ** st
15970 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20  rings and blobs 
15980 73 74 61 74 69 63 2e 20 20 41 6e 64 20 6e 6f 6e  static.  And non
15990 65 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e 74  e of the element
159a0 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 65 76 65  s are.    ** eve
159b0 72 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20 73  r transformed, s
159c0 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
159d0 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65 6c   anything to del
159e0 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ete..    */.    
159f0 69 66 28 20 4e 45 56 45 52 28 70 4d 65 6d 2d 3e  if( NEVER(pMem->
15a00 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69 74  zMalloc) ) sqlit
15a10 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
15a20 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66  (pMem);.  }.  if
15a30 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ( p->flags & UNP
15a40 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20  ACKED_NEED_FREE 
15a50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
15a60 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f  Free(p->pKeyInfo
15a70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
15a80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
15a90 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
15aa0 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
15ab0 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
15ac0 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  s.** specified b
15ad0 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  y {nKey1, pKey1}
15ae0 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74   and pPKey2.  It
15af0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74   returns a negat
15b00 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
15b10 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
15b20 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73   if key1 is less
15b30 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
15b40 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
15b50 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b  han key2.  The {
15b60 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65  nKey1, pKey1} ke
15b70 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  y must be a blob
15b80 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
15b90 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  h OP_MakeRecord 
15ba0 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
15bb0 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
15bc0 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
15bd0 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
15be0 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
15bf0 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
15c00 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
15c10 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
15c20 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
15c30 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
15c40 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
15c50 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69  s..** The key wi
15c60 74 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20  th fewer fields 
15c70 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61  is usually compa
15c80 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  res less than th
15c90 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79  e .** longer key
15ca0 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68  .  However if th
15cb0 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  e UNPACKED_INCRK
15cc0 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65  EY flags in pPKe
15cd0 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64  y2 is set.** and
15ce0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66   the common pref
15cf0 69 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20  ixes are equal, 
15d00 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73  then key1 is les
15d10 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20  s than key2..** 
15d20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b  Or if the UNPACK
15d30 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20  ED_MATCH_PREFIX 
15d40 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
15d50 74 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65  the prefixes are
15d60 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  .** equal, then 
15d70 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e  the keys are con
15d80 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71  sidered to be eq
15d90 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70  ual and.** the p
15da0 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20  arts beyond the 
15db0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72  common prefix ar
15dc0 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  e ignored..**.**
15dd0 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
15de0 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c  _IGNORE_ROWID fl
15df0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
15e00 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
15e10 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f  .** the header o
15e20 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72  f pKey1 is ignor
15e30 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
15e40 65 64 20 74 68 61 74 20 70 4b 65 79 31 20 69 73  ed that pKey1 is
15e50 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  .** an index key
15e60 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20  , and thus ends 
15e70 77 69 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c  with a rowid val
15e80 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79  ue.  The last by
15e90 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61  te.** of the hea
15ea0 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f  der will therefo
15eb0 72 65 20 62 65 20 74 68 65 20 73 65 72 69 61 6c  re be the serial
15ec0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
15ed0 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c  id:.** one of 1,
15ee0 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20   2, 3, 4, 5, 6, 
15ef0 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e  8, or 9 - the in
15f00 74 65 67 65 72 20 73 65 72 69 61 6c 20 74 79 70  teger serial typ
15f10 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61  es..** The seria
15f20 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 69  l type of the fi
15f30 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61  nal rowid will a
15f40 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c  lways be a singl
15f50 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67  e byte..** By ig
15f60 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74  noring this last
15f70 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
15f80 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68  der, we force th
15f90 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  e comparison.** 
15fa0 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f  to ignore the ro
15fb0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
15fc0 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73  f key1..*/.int s
15fd0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
15fe0 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
15ff0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
16000 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
16010 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
16020 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
16030 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
16040 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   key */.){.  int
16050 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
16060 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
16070 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
16080 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
16090 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
160a0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
160b0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
160c0 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
160d0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
160e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
160f0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
16100 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
16110 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  = 0;.  int nFiel
16120 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
16130 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
16140 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
16150 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
16160 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
16170 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16180 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
16190 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
161a0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
161b0 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
161c0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
161d0 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
161e0 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
161f0 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
16200 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
16210 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
16220 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
16230 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
16240 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
16250 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
16260 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
16270 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
16280 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
16290 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
162a0 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
162b0 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
162c0 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
162d0 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
162e0 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
162f0 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
16300 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
16310 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
16320 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
16330 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
16340 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e   initialized, an
16350 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
16360 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
16370 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
16380 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
16390 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
163a0 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
163b0 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
163c0 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
163d0 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
163e0 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
163f0 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
16400 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
16410 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
16420 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
16430 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
16440 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
16450 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
16460 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
16470 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
16480 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
16490 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
164a0 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
164b0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69  d1 = szHdr1;.  i
164c0 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
164d0 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f   & UNPACKED_IGNO
164e0 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  RE_ROWID ){.    
164f0 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20  szHdr1--;.  }.  
16500 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
16510 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69  o->nField;.  whi
16520 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
16530 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
16540 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73  eld ){.    u32 s
16550 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
16560 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
16570 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
16580 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
16590 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
165a0 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
165b0 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
165c0 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
165d0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  1 );.    if( d1>
165e0 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65  =nKey1 && sqlite
165f0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
16600 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
16610 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >0 ) break;..   
16620 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
16630 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
16640 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
16650 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
16660 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
16670 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
16680 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
16690 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
166a0 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
166b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
166c0 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
166d0 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
166e0 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
16700 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e  <nField ? pKeyIn
16710 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30  fo->aColl[i] : 0
16720 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
16730 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16740 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d  ( mem1.zMalloc==
16750 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
16760 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20  ment below */.. 
16770 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74       /* Invert t
16780 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65 20  he result if we 
16790 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20 73  are using DESC s
167a0 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
167b0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
167c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
167d0 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79  i<nField && pKey
167e0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
167f0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
16800 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
16810 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  .    .      /* I
16820 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41  f the PREFIX_SEA
16830 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20  RCH flag is set 
16840 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65  and all fields e
16850 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a  xcept the final.
16860 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66        ** rowid f
16870 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c  ield were equal,
16880 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20   then clear the 
16890 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c  PREFIX_SEARCH fl
168a0 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20  ag and set .    
168b0 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77    ** pPKey2->row
168c0 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  id to the value 
168d0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  of the rowid fie
168e0 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b  ld in (pKey1, nK
168f0 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ey1)..      ** T
16900 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
16910 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f  he OP_IsUnique o
16920 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  pcode..      */.
16930 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65 79        if( (pPKey
16940 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
16950 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43  KED_PREFIX_SEARC
16960 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32  H) && i==(pPKey2
16970 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20  ->nField-1) ){. 
16980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
16990 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72  dx1==szHdr1 && r
169a0 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c );.        ass
169b0 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20  ert( mem1.flags 
169c0 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20  & MEM_Int );.   
169d0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61       pPKey2->fla
169e0 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f  gs &= ~UNPACKED_
169f0 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20  PREFIX_SEARCH;. 
16a00 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72         pPKey2->r
16a10 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b  owid = mem1.u.i;
16a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  .      }.    .  
16a30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16a40 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
16a50 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  }..  /* No memor
16a60 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
16a70 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
16a80 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
16a90 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
16aa0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
16ab0 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
16ac0 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
16ad0 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
16ae0 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
16af0 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
16b00 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
16b10 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a  se(&mem1)..  */.
16b20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
16b30 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
16b40 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
16b50 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  ans that one of 
16b60 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
16b70 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
16b80 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
16b90 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
16ba0 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
16bb0 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
16bc0 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61  INCRKEY.  ** fla
16bd0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62  g is set, then b
16be0 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20  reak the tie by 
16bf0 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73  treating key2 as
16c00 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66   larger..  ** If
16c10 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45   the UPACKED_PRE
16c20 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69  FIX_MATCH flag i
16c30 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73  s set, then keys
16c40 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65   with common pre
16c50 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63  fixes.  ** are c
16c60 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
16c70 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  equal.  Otherwis
16c80 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65  e, the longer ke
16c90 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c  y is the .  ** l
16ca0 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61  arger.  As it ha
16cb0 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79  ppens, the pPKey
16cc0 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
16cd0 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a   the longer.  **
16ce0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
16cf0 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
16d00 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20    assert( rc==0 
16d10 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d  );.  if( pPKey2-
16d20 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
16d30 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20  D_INCRKEY ){.   
16d40 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73   rc = -1;.  }els
16d50 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c  e if( pPKey2->fl
16d60 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
16d70 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20  REFIX_MATCH ){. 
16d80 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d     /* Leave rc==
16d90 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  0 */.  }else if(
16da0 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a   idx1<szHdr1 ){.
16db0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
16dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
16dd0 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
16de0 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
16df0 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
16e00 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
16e10 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
16e20 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
16e30 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
16e40 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
16e50 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
16e60 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
16e70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
16e80 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
16e90 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
16ea0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
16eb0 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
16ec0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
16ed0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
16ee0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
16ef0 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
16f00 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
16f10 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
16f20 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
16f30 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
16f40 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
16f50 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
16f60 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
16f70 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
16f80 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
16f90 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
16fa0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
16fb0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
16fc0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
16fd0 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
16fe0 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
16ff0 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
17000 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
17010 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
17020 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
17030 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
17040 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17050 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65  ER(db);..  /* Ge
17060 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
17070 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
17080 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
17090 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
170a0 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
170b0 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
170c0 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
170d0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
170e0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
170f0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
17100 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
17110 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
17120 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
17130 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
17140 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
17150 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
17160 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
17170 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17180 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
17190 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
171a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
171b0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
171c0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
171d0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
171e0 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75  OK );     /* pCu
171f0 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
17200 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
17210 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73  not fail */.  as
17220 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
17230 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
17240 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
17250 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
17260 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
17270 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
17280 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d  dex entry */.  m
17290 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
172a0 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20  eof(m));.  rc = 
172b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
172c0 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
172d0 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
172e0 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
172f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
17300 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  c;.  }..  /* The
17310 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73   index entry mus
17320 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68  t begin with a h
17330 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20  eader size */.  
17340 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
17350 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64  2((u8*)m.z, szHd
17360 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  r);.  testcase( 
17370 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65  szHdr==3 );.  te
17380 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d  stcase( szHdr==m
17390 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  .n );.  if( unli
173a0 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20  kely(szHdr<3 || 
173b0 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20  (int)szHdr>m.n) 
173c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
173d0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
173e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
173f0 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68  last field of th
17400 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62  e index should b
17410 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74  e an integer - t
17420 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56  he ROWID..  ** V
17430 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c  erify that the l
17440 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79  ast entry really
17450 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   is an integer. 
17460 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
17470 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a  rint32((u8*)&m.z
17480 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52  [szHdr-1], typeR
17490 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
174a0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20  e( typeRowid==1 
174b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
174c0 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20  ypeRowid==2 );. 
174d0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
174e0 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73  owid==3 );.  tes
174f0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
17500 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==4 );.  testcas
17510 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20  e( typeRowid==5 
17520 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
17530 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20  ypeRowid==6 );. 
17540 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17550 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73  owid==8 );.  tes
17560 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
17570 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  ==9 );.  if( unl
17580 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c  ikely(typeRowid<
17590 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39  1 || typeRowid>9
175a0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37   || typeRowid==7
175b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
175c0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
175d0 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  on;.  }.  lenRow
175e0 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
175f0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79  SerialTypeLen(ty
17600 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
17610 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
17620 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
17630 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
17640 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
17650 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
17660 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
17670 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
17680 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
17690 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
176a0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
176b0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
176c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
176d0 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
176e0 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
176f0 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
17700 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
17710 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
17720 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
17730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
17740 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
17750 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
17760 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
17770 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
17780 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
17790 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
177a0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
177b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
177c0 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
177d0 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
177e0 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d  ase( m.zMalloc!=
177f0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
17800 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
17810 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17820 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17830 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
17840 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
17850 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
17860 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
17870 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
17880 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
17890 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
178a0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
178b0 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
178c0 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
178d0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
178e0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
178f0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
17900 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
17910 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
17920 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
17930 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
17940 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
17950 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
17960 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
17970 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
17980 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
17990 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
179a0 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
179b0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
179c0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
179d0 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
179e0 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
179f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
17a00 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
17a10 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
17a20 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
17a30 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
17a40 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
17a50 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
17a60 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
17a70 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43  Compare(.  VdbeC
17a80 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
17a90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
17aa0 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
17ab0 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70  against */.  Unp
17ac0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e  ackedRecord *pUn
17ad0 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61  packed,  /* Unpa
17ae0 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
17af0 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  key to compare a
17b00 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20  gainst */.  int 
17b10 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
17b20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
17b30 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
17b40 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
17b50 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
17b60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
17b70 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
17b80 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
17b90 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
17ba0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
17bb0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
17bc0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ur) );.  rc = sq
17bd0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
17be0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
17bf0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
17c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
17c10 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
17c20 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
17c30 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
17c40 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
17c50 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
17c60 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
17c70 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
17c80 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a  e of the say.  *
17c90 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
17ca0 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
17cb0 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
17cc0 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
17cd0 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
17ce0 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
17cf0 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
17d00 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
17d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17d20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17d30 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d  .  }.  memset(&m
17d40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
17d50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
17d60 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
17d70 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
17d80 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (int)nCellKey, 1
17d90 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
17da0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17db0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17dc0 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73  pUnpacked->flags
17dd0 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f   & UNPACKED_IGNO
17de0 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72  RE_ROWID );.  *r
17df0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
17e00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e  RecordCompare(m.
17e10 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65  n, m.z, pUnpacke
17e20 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
17e30 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
17e40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17e50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
17e60 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
17e70 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
17e80 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
17e90 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
17ea0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
17eb0 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
17ec0 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
17ed0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
17ee0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
17ef0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
17f00 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
17f10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17f20 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
17f30 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
17f40 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
17f50 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
17f60 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
17f70 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
17f80 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
17f90 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
17fa0 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
17fb0 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
17fc0 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
17fd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
17fe0 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
17ff0 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
18000 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
18010 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
18020 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
18030 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
18040 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
18050 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
18060 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
18070 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
18080 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
18090 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
180a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
180b0 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
180c0 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
180d0 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
180e0 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
180f0 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
18100 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
18110 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
18120 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
18130 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
18140 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
18150 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
18160 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
18170 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
18180 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
18190 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
181a0 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
181b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
181c0 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
181d0 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
181e0 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
181f0 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
18200 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
18210 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
18220 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
18230 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18240 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
18250 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
18260 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
18270 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
18280 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
18290 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  rn v->db;.}../*.
182a0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
182b0 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
182c0 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
182d0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
182e0 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20   value bound.** 
182f0 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f  parameter iVar o
18300 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20  f VM v. Except, 
18310 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
18320 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74  an SQL NULL, ret
18330 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61  urn .** 0 instea
18340 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  d. Unless it is 
18350 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69  NULL, apply affi
18360 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66  nity aff (one of
18370 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
18380 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20  *.** constants) 
18390 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  to the value bef
183a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74  ore returning it
183b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
183c0 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20  rned value must 
183d0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
183e0 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
183f0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
18400 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
18410 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  e *sqlite3VdbeGe
18420 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  tValue(Vdbe *v, 
18430 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
18440 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
18450 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
18460 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
18470 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
18480 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
18490 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
184a0 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
184b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
184c0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
184d0 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
184e0 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
184f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18500 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
18510 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
18520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18530 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
18540 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
18550 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
18560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
18570 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20  mStoreType((Mem 
18580 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  *)pRet);.      }
18590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
185a0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
185b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
185c0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
185d0 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
185e0 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
185f0 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
18600 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
18610 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
18620 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
18630 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
18640 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
18650 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
18660 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
18670 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
18680 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
18690 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
186a0 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
186b0 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b    if( iVar>32 ){
186c0 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
186d0 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  = 0xffffffff;.  
186e0 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78  }else{.    v->ex
186f0 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  pmask |= ((u32)1
18700 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20   << (iVar-1));. 
18710 20 7d 0a 7d 0a                                    }.}.