/ Hex Artifact Content
Login

Artifact 33448d23b857654dd69ed2103611f5c733606f68:


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 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61   (opcode==OP_Tra
2d80: 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d  nsaction && pOp-
2d90: 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64  >p2!=0) || opcod
2da0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a  e==OP_Vacuum ){.
2db0: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c        p->readOnl
2dc0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
2dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2de0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
2df0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2e00: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20  _VUpdate ){.    
2e10: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
2e20: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
2e30: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
2e40: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
2e50: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
2e60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2e80: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
2e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
2ea0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
2eb0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
2ec0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
2ee0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2ef0: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
2f00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70   }..    if( (pOp
2f10: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
2f20: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
2f30: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
2f40: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
2f50: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
2f60: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
2f70: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
2f80: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
2f90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
2fa0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
2fb0: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
2fc0: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
2fd0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ff0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3000: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3010: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
3020: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3030: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3040: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3050: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3060: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3070: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3080: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3090: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
30a0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
30b0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
30c0: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
30d0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
30e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
30f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
3100: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
3110: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3120: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
3130: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
3140: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
3150: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
3160: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
3170: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
3180: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
3190: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
31a0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
31b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
31c0: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
31d0: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
31e0: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
31f0: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
3200: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
3210: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
3220: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
3230: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
3240: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
3250: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
3260: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
3270: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
3280: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3290: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
32a0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
32b0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
32c0: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
32d0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
32e0: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
32f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3300: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
3310: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
3320: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
3330: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
3340: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
3350: 72 74 28 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d  rt( p->aMutex.nM
3360: 75 74 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  utex==0 );..  re
3370: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
3380: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
3390: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
33a0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
33b0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
33c0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
33d0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
33e0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
33f0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3400: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
3410: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
3420: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
3430: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3440: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
3450: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
3460: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3470: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
3480: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3490: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
34a0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
34b0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
34c0: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
34d0: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
34e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
34f0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3500: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
3510: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
3520: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
3530: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
3540: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
3550: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
3560: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3570: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
3580: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
3590: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
35a0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
35b0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
35c0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
35d0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
35e0: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
35f0: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
3600: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
3610: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
3620: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
3630: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
3640: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3660: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3680: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3690: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
36a0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
36b0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
36c0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
36d0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
36e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
36f0: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3700: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
3710: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
3720: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3740: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
3750: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
3760: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3770: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3780: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
37a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
37b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
37c0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
37d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
37e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
37f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3800: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3810: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3820: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3830: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3850: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3860: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3870: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3880: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
38a0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
38b0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
38c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
38d0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
38e0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
38f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3900: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3910: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
3920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3930: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3940: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
3950: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3960: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
3970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3980: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
3990: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
39a0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
39b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
39c0: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
39d0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
39e0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
39f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
3a00: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3a10: 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  nOp>addr ){.    
3a20: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3a30: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3a40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3a50: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3a60: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3a70: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3a80: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3a90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3aa0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3ab0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3ac0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3ad0: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3ae0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3af0: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3b00: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
3b10: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3b20: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3b30: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
3b40: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
3b50: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
3b60: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
3b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3b80: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
3b90: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
3ba0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
3bb0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
3bc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
3bd0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  0 );.    p->aOp[
3be0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76  p->nOp-1].p5 = v
3bf0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3c00: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
3c10: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
3c20: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
3c30: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
3c40: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
3c50: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3c60: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
3c70: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3c80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3c90: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3ca0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r){.  sqlite3Vdb
3cb0: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
3cc0: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
3cd0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
3ce0: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
3cf0: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
3d00: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
3d10: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
3d20: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
3d30: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
3d40: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
3d50: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
3d60: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
3d70: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
3d80: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c  *pDef){.  if( AL
3d90: 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70  WAYS(pDef) && (p
3da0: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
3db0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
3dc0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3dd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
3de0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
3df0: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
3e00: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
3e10: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
3e20: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
3e30: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
3e40: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
3e50: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
3e60: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
3e70: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
3e80: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
3e90: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
3ea0: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
3eb0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
3ec0: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
3ed0: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
3ee0: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
3ef0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f00: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
3f10: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
3f20: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
3f30: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
3f40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3f50: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
3f60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3f80: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
3f90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
3fa0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
3fb0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
3fc0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
3fd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3fe0: 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55    case P4_VDBEFU
3ff0: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
4000: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
4010: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
4020: 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p4;.        free
4030: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
4040: 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d  n(db, pVdbeFunc-
4050: 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  >pFunc);.       
4060: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4070: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4080: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
4090: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
40a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
40b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
40c0: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
40d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
40e0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
40f0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
4100: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4110: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
4120: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
4130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4140: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
4150: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  EM: {.        if
4160: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4170: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
4180: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
4190: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
41a0: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
41b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
41c0: 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a    Mem *p = (Mem*
41d0: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  )p4;.          s
41e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
41f0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
4200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4210: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
4220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4240: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
4250: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
4260: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4270: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
4280: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
4290: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
42b0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
42c0: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
42d0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
42e0: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
42f0: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
4300: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
4310: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
4320: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
4330: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
4340: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
4350: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
4360: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
4370: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
4380: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
4390: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
43a0: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
43b0: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
43c0: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
43d0: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
43e0: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
43f0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
4400: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
4410: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4420: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
4430: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
4440: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
4450: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
4460: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4470: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
4480: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
4490: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
44a0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
44b0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
44c0: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
44d0: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
44e0: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
44f0: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
4500: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
4510: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
4520: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
4530: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
4540: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4550: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
4560: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
4570: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
4580: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
4590: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
45a0: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
45b0: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
45c0: 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73  Change N opcodes
45d0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64   starting at add
45e0: 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a  r to No-ops..*/.
45f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4600: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
4610: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
4620: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d  int N){.  if( p-
4630: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
4640: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
4650: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
4660: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4670: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ;.    while( N--
4680: 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34   ){.      freeP4
4690: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
46a0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
46b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
46c0: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
46d0: 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ));.      pOp->o
46e0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
46f0: 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20  .      pOp++;.  
4700: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4710: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
4720: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
4730: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
4740: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
4750: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4760: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
4770: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
4780: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
4790: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
47a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
47b0: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
47c0: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
47d0: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
47e0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
47f0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
4800: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
4810: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
4820: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
4830: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
4840: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
4850: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
4860: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4870: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
4880: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
4890: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
48a0: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
48b0: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
48c0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
48d0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
48e0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
48f0: 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP4..**.** If
4900: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69   n==P4_KEYINFO i
4910: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34  t means that zP4
4920: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4930: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
4940: 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  ture..** A copy 
4950: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b  is made of the K
4960: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4970: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
4980: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
4990: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f  lite3_malloc, to
49a0: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
49b0: 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c  he Vdbe is final
49c0: 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b  ized..** n==P4_K
49d0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
49e0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50  ndicates that zP
49f0: 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65  4 points to a Ke
4a00: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  yInfo structure.
4a10: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ** stored in mem
4a20: 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c  ory that the cal
4a30: 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64  ler has obtained
4a40: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
4a50: 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61  lloc. The .** ca
4a60: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ller should not 
4a70: 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  free the allocat
4a80: 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
4a90: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4aa0: 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69  dbe is.** finali
4ab0: 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zed..** .** Othe
4ac0: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
4ad0: 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c  4_STATIC, P4_COL
4ae0: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
4af0: 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69  ate that zP4 poi
4b00: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
4b10: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
4b20: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
4b30: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
4b40: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
4b50: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
4b60: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
4b70: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
4b80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
4b90: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
4ba0: 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20  hange P4 on the 
4bb0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
4bc0: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
4bd0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4be0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4bf0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4c00: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
4c10: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P4, int n){.  Op
4c20: 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33   *pOp;.  sqlite3
4c30: 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
4c40: 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
4c50: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
4c60: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4c70: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4c80: 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  f( p->aOp==0 || 
4c90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4ca0: 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21 3d   ){.    if ( n!=
4cb0: 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21  P4_KEYINFO && n!
4cc0: 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20 20  =P4_VTAB ) {.   
4cd0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c     freeP4(db, n,
4ce0: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
4cf0: 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP4);.    }.  
4d00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4d10: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
4d20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
4d30: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  dr<p->nOp );.  i
4d40: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
4d50: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
4d60: 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   1;.  }.  pOp = 
4d70: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
4d80: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
4d90: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
4da0: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70  .p);.  pOp->p4.p
4db0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50   = 0;.  if( n==P
4dc0: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
4dd0: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
4de0: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
4df0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
4e00: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
4e10: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
4e20: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
4e30: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
4e40: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
4e50: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
4e60: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
4e70: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
4e80: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
4e90: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP4==0 ){.    p
4ea0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
4eb0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4ec0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P4_NOTUSED;.  }e
4ed0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
4ee0: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
4ef0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
4f00: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
4f10: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
4f20: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
4f30: 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP4)->nField;.  
4f40: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
4f50: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
4f60: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
4f70: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
4f80: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
4f90: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
4fa0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
4fb0: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  0, nByte);.    p
4fc0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
4fd0: 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  = pKeyInfo;.    
4fe0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
4ff0: 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74 4f        u8 *aSortO
5000: 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rder;.      memc
5010: 70 79 28 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  py((char*)pKeyIn
5020: 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 20 2d  fo, zP4, nByte -
5030: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
5040: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  aSortOrder = pKe
5050: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
5060: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f  r;.      if( aSo
5070: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
5080: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
5090: 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67  rtOrder = (unsig
50a0: 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49  ned char*)&pKeyI
50b0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c  nfo->aColl[nFiel
50c0: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  d];.        memc
50d0: 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  py(pKeyInfo->aSo
50e0: 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72  rtOrder, aSortOr
50f0: 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  der, nField);.  
5100: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d      }.      pOp-
5110: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
5120: 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  INFO;.    }else{
5130: 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61  .      p->db->ma
5140: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
5150: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
5160: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
5170: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
5180: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  ( n==P4_KEYINFO_
5190: 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70  HANDOFF ){.    p
51a0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
51b0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
51c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
51d0: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
51e0: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
51f0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5200: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5210: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5220: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
5230: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
5240: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
5250: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
5260: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
5270: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5280: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
5290: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
52a0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
52b0: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
52c0: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
52d0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
52e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
52f0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
5300: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
5310: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
5320: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
5330: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
5340: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  AMIC;.  }.}..#if
5350: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
5360: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
5370: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20  ment on the the 
5380: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
5390: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
53a0: 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61    Or.** insert a
53b0: 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74   No-op and add t
53c0: 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68  he comment to th
53d0: 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  at new instructi
53e0: 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b  on.  This.** mak
53f0: 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69  es the code easi
5400: 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e  er to read durin
5410: 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f  g debugging.  No
5420: 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65  ne of this happe
5430: 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75  ns.** in a produ
5440: 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ction build..*/.
5450: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5460: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5470: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5480: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
5490: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
54a0: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  !p ) return;.  a
54b0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
54c0: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
54d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
54e0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
54f0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5500: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
5510: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5520: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
5530: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
5540: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5550: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61  zComment;.    va
5560: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
5570: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
5580: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70  DbFree(p->db, *p
5590: 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71  z);.    *pz = sq
55a0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
55b0: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
55c0: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
55d0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
55e0: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
55f0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
5600: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5610: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
5620: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20  st ap;.  if( !p 
5630: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
5640: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
5650: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73   OP_Noop);.  ass
5660: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
5670: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
5680: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
5690: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
56a0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
56b0: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
56c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
56d0: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
56e0: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e  char **pz = &p->
56f0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5700: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73  omment;.    va_s
5710: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
5720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
5730: 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29  Free(p->db, *pz)
5740: 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69  ;.    *pz = sqli
5750: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
5760: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
5770: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
5780: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
5790: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
57a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
57b0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
57c0: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
57d0: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
57e0: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
57f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5800: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
5810: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
5820: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
5830: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
5840: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
5850: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
5860: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
5870: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
5880: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
5890: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
58a0: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
58b0: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
58c0: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
58d0: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
58e0: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
58f0: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
5900: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
5910: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
5920: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
5930: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
5940: 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74  fter a OOM fault
5950: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
5960: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
5970: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
5980: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
5990: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
59a0: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
59b0: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
59c0: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
59d0: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
59e0: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
59f0: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
5a00: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
5a10: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
5a20: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
5a30: 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74  ind..**.** About
5a40: 20 74 68 65 20 23 69 66 64 65 66 20 53 51 4c 49   the #ifdef SQLI
5a50: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20  TE_OMIT_TRACE:  
5a60: 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72  Normally, this r
5a70: 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
5a80: 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73  called.** unless
5a90: 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73   p->nOp>0.  This
5aa0: 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
5ab0: 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53 51  he absense of SQ
5ac0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c  LITE_OMIT_TRACE,
5ad0: 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 20  .** an OP_Trace 
5ae0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  instruction is a
5af0: 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64 20 62  lways inserted b
5b00: 79 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  y sqlite3VdbeGet
5b10: 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a  () as soon as.**
5b20: 20 61 20 6e 65 77 20 56 44 42 45 20 69 73 20 63   a new VDBE is c
5b30: 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20 61  reated.  So we a
5b40: 72 65 20 66 72 65 65 20 74 6f 20 73 65 74 20 61  re free to set a
5b50: 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20  ddr to p->nOp-1 
5b60: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
5b70: 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63  g to double-chec
5b80: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
5b90: 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 69  hat the result i
5ba0: 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20  s non-negative. 
5bb0: 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  But.** if SQLITE
5bc0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20 64  _OMIT_TRACE is d
5bd0: 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54  efined, the OP_T
5be0: 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64 20  race is omitted 
5bf0: 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20 74  and we do need t
5c00: 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 76  o.** check the v
5c10: 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31  alue of p->nOp-1
5c20: 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
5c30: 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ng..*/.VdbeOp *s
5c40: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5c50: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5c60: 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65  r){.  /* C89 spe
5c70: 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20  cifies that the 
5c80: 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22  constant "dummy"
5c90: 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   will be initial
5ca0: 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a  ized to all.  **
5cb0: 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73   zeros, which is
5cc0: 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20   correct.  MSVC 
5cd0: 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e  generates a warn
5ce0: 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73  ing, nevertheles
5cf0: 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  s. */.  static c
5d00: 6f 6e 73 74 20 56 64 62 65 4f 70 20 64 75 6d 6d  onst VdbeOp dumm
5d10: 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  y;  /* Ignore th
5d20: 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61  e MSVC warning a
5d30: 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69  bout no initiali
5d40: 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  zer */.  assert(
5d50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
5d60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
5d70: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23 69  if( addr<0 ){.#i
5d80: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5d90: 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 70  _TRACE.    if( p
5da0: 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75 72  ->nOp==0 ) retur
5db0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
5dc0: 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64  y;.#endif.    ad
5dd0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5de0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
5df0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
5e00: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
5e10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5e20: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
5e30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
5e40: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
5e50: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
5e60: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
5e70: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
5e80: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
5e90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
5ea0: 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e  PLAIN) || !defin
5eb0: 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20  ed(NDEBUG) \.   
5ec0: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42    || defined(VDB
5ed0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
5ee0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
5ef0: 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  UG)./*.** Comput
5f00: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
5f10: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34  describes the P4
5f20: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
5f30: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
5f40: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
5f50: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
5f60: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
5f70: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
5f80: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f  displayP4(Op *pO
5f90: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
5fa0: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
5fb0: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b  ar *zP4 = zTemp;
5fc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
5fd0: 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68  >=20 );.  switch
5fe0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
5ff0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
6000: 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20  INFO_STATIC:.   
6010: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
6020: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
6030: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
6040: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
6050: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
6060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6070: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6080: 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64  emp, "keyinfo(%d
6090: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
60a0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
60b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
60c0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
60d0: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
60e0: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
60f0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
6100: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
6110: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
6120: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
6130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
6140: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
6150: 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  en30(pColl->zNam
6160: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
6170: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
6180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
6190: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c  cpy(&zTemp[i],",
61a0: 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20  ...",4);.       
61b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
61c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
61d0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
61e0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ,';.          if
61f0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
6200: 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e  tOrder && pKeyIn
6210: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
6220: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
6230: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d   zTemp[i++] = '-
6240: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
6250: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6260: 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c  &zTemp[i], pColl
6270: 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20  ->zName,n+1);.  
6280: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a          i += n;.
6290: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
62a0: 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b  ( i+4<nTemp-6 ){
62b0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
62c0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69  y(&zTemp[i],",ni
62d0: 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  l",4);.         
62e0: 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20   i += 4;.       
62f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6300: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29   zTemp[i++] = ')
6310: 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69  ';.      zTemp[i
6320: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  ] = 0;.      ass
6330: 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a  ert( i<nTemp );.
6340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6350: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43   }.    case P4_C
6360: 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20  OLLSEQ: {.      
6370: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
6380: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a   pOp->p4.pColl;.
6390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
63a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
63b0: 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e  emp, "collseq(%.
63c0: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
63d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
63e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
63f0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
6400: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
6410: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
6420: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
6430: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6440: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
6450: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
6460: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
6470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6480: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6490: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
64a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
64b0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
64c0: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
64d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
64e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
64f0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
6500: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6510: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6520: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
6530: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6540: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6550: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
6560: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6570: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6580: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
6590: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
65a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
65b0: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
65c0: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
65d0: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
65e0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65      assert( (pMe
65f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
6600: 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ull)==0 );.     
6610: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6620: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
6630: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
6640: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
6650: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6660: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
6670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6680: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6690: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  emp, "%lld", pMe
66a0: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
66b0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
66c0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
66d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
66e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
66f0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
6700: 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  ", pMem->r);.   
6710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6720: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
6730: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
6740: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   );.        zP4 
6750: 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20  = "(blob)";.    
6760: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6770: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
6780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6790: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
67a0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
67b0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
67c0: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
67d0: 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
67e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
67f0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6800: 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c  p, "vtab:%p:%p",
6810: 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70   pVtab, pVtab->p
6820: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62  Module);.      b
6830: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6840: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
6850: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
6860: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6870: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6880: 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20  "intarray");.   
6890: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
68a0: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
68b0: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
68c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
68d0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
68e0: 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
68f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6900: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6910: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
6920: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
6930: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
6940: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
6950: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6960: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6970: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
6980: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
6990: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
69a0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
69b0: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
69c0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
69d0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
69e0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
69f0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
6a00: 6d 65 6e 74 20 68 61 73 20 74 6f 20 6b 6e 6f 77  ment has to know
6a10: 20 69 6e 20 61 64 76 61 6e 63 65 20 77 68 69 63   in advance whic
6a20: 68 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 0a  h Btree objects.
6a30: 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ** will be used 
6a40: 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 61  so that it can a
6a50: 63 71 75 69 72 65 20 6d 75 74 65 78 65 73 20 6f  cquire mutexes o
6a60: 6e 20 74 68 65 6d 20 61 6c 6c 20 69 6e 20 73 6f  n them all in so
6a70: 72 74 65 64 0a 2a 2a 20 6f 72 64 65 72 20 28 76  rted.** order (v
6a80: 69 61 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75  ia sqlite3VdbeMu
6a90: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 29 2e  texArrayEnter().
6aa0: 20 20 4d 75 74 65 78 65 73 20 61 72 65 20 61 63    Mutexes are ac
6ab0: 71 75 69 72 65 64 0a 2a 2a 20 69 6e 20 6f 72 64  quired.** in ord
6ac0: 65 72 20 28 61 6e 64 20 72 65 6c 65 61 73 65 64  er (and released
6ad0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
6ae0: 72 29 20 74 6f 20 61 76 6f 69 64 20 64 65 61 64  r) to avoid dead
6af0: 6c 6f 63 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  locks..*/.void s
6b00: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
6b10: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
6b20: 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b   i){.  int mask;
6b30: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
6b40: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
6b50: 26 26 20 69 3c 73 69 7a 65 6f 66 28 75 33 32 29  && i<sizeof(u32)
6b60: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
6b70: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
6b80: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
6b90: 0a 20 20 6d 61 73 6b 20 3d 20 28 28 75 33 32 29  .  mask = ((u32)
6ba0: 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d  1)<<i;.  if( (p-
6bb0: 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73  >btreeMask & mas
6bc0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  k)==0 ){.    p->
6bd0: 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  btreeMask |= mas
6be0: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  k;.    sqlite3Bt
6bf0: 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73  reeMutexArrayIns
6c00: 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20  ert(&p->aMutex, 
6c10: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
6c20: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20  t);.  }.}...#if 
6c30: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
6c40: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
6c50: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
6c60: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
6c70: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
6c80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6c90: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
6ca0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
6cb0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
6cc0: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
6cd0: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
6ce0: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
6cf0: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
6d00: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6d10: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
6d20: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
6d30: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
6d40: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
6d50: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
6d60: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
6d70: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
6d80: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
6d90: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
6da0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
6db0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
6dc0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
6dd0: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
6de0: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
6df0: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
6e00: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6e10: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
6e20: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
6e30: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
6e40: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
6e50: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
6e60: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
6e70: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
6e80: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
6e90: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
6ea0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
6eb0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
6ec0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
6ed0: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
6ee0: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
6ef0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
6f00: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
6f10: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
6f20: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
6f30: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
6f40: 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  d ){.      for(p
6f50: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
6f60: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
6f70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6f80: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
6f90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
6fa0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
6fb0: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
6fc0: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
6fd0: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
6fe0: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
6ff0: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
7000: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
7010: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
7020: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
7030: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
7040: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
7050: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
7060: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
7070: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
7080: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
7090: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
70a0: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
70b0: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
70c0: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
70d0: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
70e0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
70f0: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
7100: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
7110: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
7120: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
7130: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
7140: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
7150: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
7160: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
7170: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
7180: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
7190: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
71a0: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
71b0: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
71c0: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
71d0: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
71e0: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
71f0: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
7200: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
7210: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
7220: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
7230: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
7240: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
7250: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
7260: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
7270: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
7280: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
7290: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
72a0: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
72b0: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
72c0: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
72d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
72e0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
72f0: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
7300: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
7310: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
7320: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7330: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
7340: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c  else if( p->zMal
7350: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
7360: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7370: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
7380: 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63        p->zMalloc
7390: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
73a0: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
73b0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  MEM_Null;.    }.
73c0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
73d0: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
73e0: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
73f0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
7400: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
7410: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
7420: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
7430: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
7440: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
7450: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
7460: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
7470: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7480: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
7490: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
74a0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
74b0: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
74c0: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
74d0: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
74e0: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
74f0: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
7500: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7510: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
7520: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
7530: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
7540: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
7550: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
7560: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
7570: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
7580: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
7590: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
75a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
75b0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
75c0: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
75d0: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
75e0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
75f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
7600: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
7610: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
7620: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
7630: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
7640: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
7650: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
7660: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
7670: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
7680: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
7690: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
76a0: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
76b0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
76c0: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
76d0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
76e0: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
76f0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
7700: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
7710: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
7720: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
7730: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
7740: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
7750: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
7760: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
7770: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
7780: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
7790: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
77a0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
77b0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
77c0: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
77d0: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
77e0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
77f0: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
7800: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
7810: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
7820: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7840: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
7850: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
7880: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
7890: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
78a0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
78d0: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
78e0: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
78f0: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
7900: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7910: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
7920: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
7930: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
7960: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
7970: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
7980: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79a0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
79b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
79c0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
79f0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
7a00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7a30: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
7a40: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
7a50: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f   &p->aMem[1];  /
7a60: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
7a70: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
7a80: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
7a90: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
7aa0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
7ab0: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
7ac0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
7ad0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
7ae0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
7af0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
7b00: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
7b10: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
7b20: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
7b30: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
7b40: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
7b50: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
7b60: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
7b70: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
7b80: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
7b90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
7ba0: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
7bb0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
7bc0: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
7bd0: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
7be0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
7bf0: 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  8);..  if( p->rc
7c00: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
7c10: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
7c20: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
7c30: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
7c40: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
7c50: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
7c60: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
7c70: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
7c80: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
7c90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7ca0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
7cb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
7cc0: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
7cd0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
7ce0: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
7cf0: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
7d00: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
7d10: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
7d20: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
7d30: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
7d40: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
7d50: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
7d60: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
7d70: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
7d80: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
7d90: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
7da0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
7db0: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
7dc0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
7dd0: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
7de0: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
7df0: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
7e00: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
7e10: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
7e20: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
7e30: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
7e40: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
7e50: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
7e60: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
7e70: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
7e80: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
7e90: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
7ea0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
7eb0: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
7ec0: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
7ed0: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
7ee0: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
7ef0: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
7f00: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
7f10: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
7f20: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
7f30: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
7f40: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
7f50: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
7f60: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
7f70: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
7f80: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
7f90: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
7fa0: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
7fb0: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
7fc0: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
7fd0: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
7fe0: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
7ff0: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
8000: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
8010: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
8020: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
8030: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
8040: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
8050: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
8060: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
8070: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
8080: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
8090: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
80a0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
80b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
80c0: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
80d0: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
80e0: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
80f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
8100: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
8110: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
8120: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
8130: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
8140: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
8150: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
8160: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
8170: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8180: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
8190: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
81a0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
81b0: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
81c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
81d0: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
81e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
81f0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
8200: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
8210: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
8220: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
8230: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
8240: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
8250: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
8260: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
8270: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
8280: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
8290: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
82a0: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
82b0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
82c0: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
82d0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
82e0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
82f0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
8300: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
8310: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
8320: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
8330: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
8340: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
8350: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
8360: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
8370: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
8380: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
8390: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
83a0: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
83b0: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
83c0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
83d0: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
83e0: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
83f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
8400: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
8410: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8420: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
8430: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8440: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
8450: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
8490: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
84a0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
84b0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
84c0: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
84d0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
84e0: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
84f0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8500: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20  (pOp->opcode);  
8510: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
8520: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
8530: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
8540: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
8550: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
8560: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
8570: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
8580: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
8590: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
85a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
85b0: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
85c0: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
85d0: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
85e0: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
85f0: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
8600: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
8610: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
8620: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
8630: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
8640: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
8650: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
8660: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
8670: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
8680: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
8690: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
86a0: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
86b0: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
86c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
86d0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
86e0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
86f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
8700: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
8710: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
8720: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
8730: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
8740: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
8750: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
8760: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
8770: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
8780: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
8790: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
87a0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
87b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
87c0: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31  w(pSub, nByte, 1
87d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
87e0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
87f0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
8800: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
8810: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
8820: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
8830: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
8840: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
8850: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
8860: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
8870: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
8880: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8890: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
88a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
88b0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
88c0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88e0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
88f0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8900: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
8910: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
8920: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
8930: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
8940: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
8970: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
8980: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
8990: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
89a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
89b0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
89c0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
89f0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
8a00: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
8a10: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
8a20: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8a30: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
8a40: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
8a50: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
8a60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
8a70: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8a80: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
8a90: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8aa0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
8ab0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
8ac0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
8ad0: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
8ae0: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
8af0: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
8b00: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
8b10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
8b20: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
8b30: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
8b40: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
8b50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8b60: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
8b70: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
8b80: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
8b90: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
8ba0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
8bb0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
8bc0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8bd0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
8be0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
8bf0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
8c00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8c10: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
8c20: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
8c30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
8c40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8c50: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8c60: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
8c80: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8c90: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
8ca0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
8cb0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
8cc0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8cd0: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
8ce0: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
8cf0: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
8d00: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8d10: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
8d20: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
8d30: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
8d40: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
8d50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
8d60: 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d     if( pOp->zCom
8d70: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
8d80: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8d90: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
8da0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
8db0: 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b  = pOp->zComment;
8dc0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
8dd0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
8de0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
8df0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
8e00: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
8e10: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8e20: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
8e30: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
8e40: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
8e50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8e60: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
8e90: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
8ea0: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
8eb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8ec0: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
8ed0: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
8ee0: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
8ef0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
8f00: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8f10: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
8f20: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
8f30: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
8f40: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8f60: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
8f70: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
8f80: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
8f90: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
8fa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8fb0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
8fc0: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
8fd0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
8fe0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
8ff0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
9000: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
9010: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
9020: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
9030: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
9040: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9050: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
9060: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
9070: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
9080: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
9090: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
90a0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
90b0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
90c0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
90d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
90e0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
90f0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
9100: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
9110: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
9120: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9130: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
9140: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
9150: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
9160: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
9170: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
9180: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
9190: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
91a0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
91b0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
91c0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
91d0: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
91e0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
91f0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
9200: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
9210: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9220: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
9230: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
9240: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
9250: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9260: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
9270: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
9280: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9290: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
92a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
92b0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
92c0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
92d0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
92e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
92f0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
9300: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
9310: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
9320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
9330: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
9340: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9350: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9360: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
9370: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
9380: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
9390: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
93a0: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
93b0: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
93c0: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
93d0: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
93e0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
93f0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
9400: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
9410: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
9420: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
9430: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
9440: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
9450: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
9460: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
9470: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
9480: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
9490: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
94a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
94b0: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
94c0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
94d0: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
94e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
94f0: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
9500: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
9510: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
9520: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
9530: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
9540: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
9550: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
9560: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
9570: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
9580: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
9590: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
95a0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   needed..**.** *
95b0: 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f  ppFrom points to
95c0: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
95d0: 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73   and pEnd points
95e0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
95f0: 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  he.** available 
9600: 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61  space.  When spa
9610: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ce is allocated,
9620: 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61   *ppFrom is adva
9630: 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65  nced past.** the
9640: 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f   end of the allo
9650: 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a  cated space..**.
9660: 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20  ** *pnByte is a 
9670: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
9680: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9690: 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76  f space that hav
96a0: 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61  e failed.** to a
96b0: 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65  llocate.  If the
96c0: 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  re is insufficie
96d0: 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46  nt space in *ppF
96e0: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
96f0: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
9700: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
9710: 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f  nByte by the amo
9720: 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65  unt of the reque
9730: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
9740: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
9750: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
9760: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
9770: 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77  return pointer w
9780: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f  ill be stored */
9790: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
97a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
97b0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c  r of bytes to al
97c0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a  locate */.  u8 *
97d0: 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  *ppFrom,        
97e0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f   /* IN/OUT: Allo
97f0: 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f  cate from *ppFro
9800: 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c  m */.  u8 *pEnd,
9810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9820: 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65  ointer to 1 byte
9830: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
9840: 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20   *ppFrom buffer 
9850: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65  */.  int *pnByte
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
9880: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
9890: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
98a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
98b0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
98c0: 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20  T(*ppFrom) );.  
98d0: 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72  if( pBuf ) retur
98e0: 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20  n pBuf;.  nByte 
98f0: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
9900: 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d  .  if( &(*ppFrom
9910: 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64  )[nByte] <= pEnd
9920: 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28   ){.    pBuf = (
9930: 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20  void*)*ppFrom;. 
9940: 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42     *ppFrom += nB
9950: 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  yte;.  }else{.  
9960: 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79    *pnByte += nBy
9970: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
9980: 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pBuf;.}../*.** 
9990: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
99a0: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
99b0: 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ecution.  This i
99c0: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
99d0: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
99e0: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
99f0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
9a00: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
9a10: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
9a20: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
9a30: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
9a40: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
9a50: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
9a60: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
9a70: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
9a80: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  * This is the on
9a90: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61  ly way to move a
9aa0: 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f   VDBE from VDBE_
9ab0: 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a  MAGIC_INIT to.**
9ac0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e   VDBE_MAGIC_RUN.
9ad0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9ae0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
9af0: 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
9b00: 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69  e on a single vi
9b10: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
9b20: 2a 20 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * The first call
9b30: 20 69 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63   is made while c
9b40: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c  ompiling the SQL
9b50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73   statement. Subs
9b60: 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20  equent.** calls 
9b70: 61 72 65 20 6d 61 64 65 20 61 73 20 70 61 72 74  are made as part
9b80: 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   of the process 
9b90: 6f 66 20 72 65 73 65 74 74 69 6e 67 20 61 20 73  of resetting a s
9ba0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a  tatement to be.*
9bb0: 2a 20 72 65 2d 65 78 65 63 75 74 65 64 20 28 66  * re-executed (f
9bc0: 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  rom a call to sq
9bd0: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20  lite3_reset()). 
9be0: 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20  The nVar, nMem, 
9bf0: 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20  nCursor .** and 
9c00: 69 73 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65  isExplain parame
9c10: 74 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61  ters are only pa
9c20: 73 73 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c  ssed correct val
9c30: 75 65 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ues the first ti
9c40: 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69  me.** the functi
9c50: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e  on is called. On
9c60: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
9c70: 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  s, from sqlite3_
9c80: 72 65 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a  reset(), nVar.**
9c90: 20 69 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e   is passed -1 an
9ca0: 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20  d nMem, nCursor 
9cb0: 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72  and isExplain ar
9cc0: 65 20 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72  e all passed zer
9cd0: 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
9ce0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
9cf0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
9d20: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
9d50: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
9d60: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
9d70: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
9da0: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
9db0: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
9dc0: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
9dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9de0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
9df0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
9e00: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e20: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
9e30: 20 6f 66 20 61 72 67 73 20 69 6e 20 53 75 62 50   of args in SubP
9e40: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
9e50: 20 69 73 45 78 70 6c 61 69 6e 2c 20 20 20 20 20   isExplain,     
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9e70: 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41  rue if the EXPLA
9e80: 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70  IN keywords is p
9e90: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
9ea0: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
9eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9ec0: 75 65 20 74 6f 20 73 65 74 20 56 64 62 65 2e 75  ue to set Vdbe.u
9ed0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a  sesStmtJournal *
9ee0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
9ef0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
9f00: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
9f10: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
9f20: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
9f30: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
9f40: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
9f50: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
9f60: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
9f70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
9f80: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
9f90: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
9fa0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
9fb0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
9fc0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
9fd0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
9fe0: 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  RUN;..  /* For e
9ff0: 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69  ach cursor requi
a000: 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  red, also alloca
a010: 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  te a memory cell
a020: 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65  . Memory.  ** ce
a030: 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72  lls (nMem+1-nCur
a040: 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c  sor)..nMem, incl
a050: 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65  usive, will neve
a060: 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  r be used by.  *
a070: 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  * the vdbe progr
a080: 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79  am. Instead they
a090: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c   are used to all
a0a0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a  ocate space for.
a0b0: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f    ** VdbeCursor/
a0c0: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
a0d0: 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66  res. The blob of
a0e0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
a0f0: 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75  ed with .  ** cu
a100: 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64  rsor 0 is stored
a110: 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
a120: 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c  nMem. Memory cel
a130: 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20  l (nMem-1).  ** 
a140: 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20  stores the blob 
a150: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
a160: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
a170: 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20   1, etc..  **.  
a180: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
a190: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
a1a0: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
a1b0: 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ursor;..  /* All
a1c0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
a1d0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
a1e0: 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c  , SQL variables,
a1f0: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e   VDBE cursors an
a200: 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79  d .  ** an array
a210: 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20   to marshal SQL 
a220: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
a230: 74 73 20 69 6e 2e 20 54 68 69 73 20 69 73 20 6f  ts in. This is o
a240: 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a  nly done the.  *
a250: 2a 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  * first time thi
a260: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a270: 6c 6c 65 64 20 66 6f 72 20 61 20 67 69 76 65 6e  lled for a given
a280: 20 56 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20   VDBE, not when 
a290: 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  it is.  ** being
a2a0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c   called from sql
a2b0: 69 74 65 33 5f 72 65 73 65 74 28 29 20 74 6f 20  ite3_reset() to 
a2c0: 72 65 73 65 74 20 74 68 65 20 76 69 72 74 75 61  reset the virtua
a2d0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a  l machine..  */.
a2e0: 20 20 69 66 28 20 6e 56 61 72 3e 3d 30 20 26 26    if( nVar>=0 &&
a2f0: 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c   ALWAYS(db->mall
a300: 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a  ocFailed==0) ){.
a310: 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28      u8 *zCsr = (
a320: 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e  u8 *)&p->aOp[p->
a330: 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d  nOp];       /* M
a340: 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20  emory avaliable 
a350: 66 6f 72 20 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f  for alloation */
a360: 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20  .    u8 *zEnd = 
a370: 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d  (u8 *)&p->aOp[p-
a380: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
a390: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
a3a0: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f  available mem */
a3b0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3e0: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
a3f0: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
a400: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
a410: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
a420: 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a      p->usesStmtJ
a430: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
a440: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20  sStmtJournal;.  
a450: 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20    if( isExplain 
a460: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
a470: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
a480: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
a490: 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43  zCsr, 0, zEnd-zC
a4a0: 73 72 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d  sr);.    zCsr +=
a4b0: 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29   (zCsr - (u8*)0)
a4c0: 26 37 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  &7;.    assert( 
a4d0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
a4e0: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20  MENT(zCsr) );.. 
a4f0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72     /* Memory for
a500: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
a510: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
a520: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
a530: 64 20 69 6e 20 74 77 6f 0a 20 20 20 20 2a 2a 20  d in two.    ** 
a540: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
a550: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
a560: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
a570: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
a580: 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
a590: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
a5a0: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
a5b0: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
a5c0: 6c 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  l memory.    ** 
a5d0: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
a5e0: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
a5f0: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
a600: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
a610: 20 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20     ** pass will 
a620: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
a630: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
a640: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 20  llocation.  .   
a650: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
a660: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
a670: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
a680: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
a690: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
a6a0: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
a6b0: 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  r space at the e
a6c0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
a6d0: 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69   array can signi
a6e0: 66 69 63 61 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  ficantly.    ** 
a6f0: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
a700: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
a710: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
a720: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
a730: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
a740: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  nByte = 0;.     
a750: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
a760: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
a770: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
a780: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
a790: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Byte);.      p->
a7a0: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
a7b0: 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  e(p->aVar, nVar*
a7c0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
a7d0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
a7e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  );.      p->apAr
a7f0: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
a800: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
a810: 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73  zeof(Mem*), &zCs
a820: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
a830: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
a840: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
a850: 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  >azVar, nVar*siz
a860: 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73  eof(char*), &zCs
a870: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
a880: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
a890: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
a8a0: 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
a8b0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
a8c0: 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r*),.           
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
a8f0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
a900: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
a910: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
a920: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
a930: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
a940: 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20     }.      zCsr 
a950: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
a960: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
a970: 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Byte];.    }whil
a980: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
a990: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
a9a0: 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ..    p->nCursor
a9b0: 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b   = (u16)nCursor;
a9c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 56 61 72  .    if( p->aVar
a9d0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61   ){.      p->nVa
a9e0: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
a9f0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  .      for(n=0; 
aa00: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
aa10: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
aa20: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
aa30: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  l;.        p->aV
aa40: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
aa50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
aa60: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
aa70: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b        p->aMem--;
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
aaa0: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
aab0: 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  m */.      p->nM
aac0: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
aae0: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
aaf0: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20  nMem-1 */.      
ab00: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
ab10: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
ab20: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
ab30: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
ab40: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
ab50: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
ab60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
ab70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ab80: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e   for(n=1; n<p->n
ab90: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61  Mem; n++){.    a
aba0: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e  ssert( p->aMem[n
abb0: 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a  ].db==db );.  }.
abc0: 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20  #endif..  p->pc 
abd0: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
abe0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
abf0: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
ac00: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70  _Abort;.  p->exp
ac10: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
ac20: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
ac30: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
ac40: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
ac50: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
ac60: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
ac70: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
ac80: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
ac90: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
aca0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
acb0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
acc0: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74  FILE.  {.    int
acd0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ace0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
acf0: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
ad00: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  .cnt = 0;.      
ad10: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
ad20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
ad30: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
ad40: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
ad50: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
ad60: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
ad70: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
ad80: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
ad90: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
ada0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
adb0: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
adc0: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
add0: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
ade0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
adf0: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
ae00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
ae10: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
ae20: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
ae30: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
ae40: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
ae50: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
ae60: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
ae70: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
ae80: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
ae90: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
aea0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
aeb0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
aec0: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
aed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
aee0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
aef0: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
af00: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
af10: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
af20: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
af30: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
af40: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
af50: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
af60: 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  = pCx->pModule;.
af70: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
af80: 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f  hod = 1;.    pMo
af90: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
afa0: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  abCursor);.    p
afb0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
afc0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
afe0: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
aff0: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
b000: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
b010: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
b020: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
b030: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
b040: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
b050: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
b060: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
b070: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
b080: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
b090: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
b0a0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
b0b0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
b0c0: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
b0d0: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
b0e0: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
b0f0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
b100: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
b110: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
b120: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
b130: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
b140: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
b150: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
b160: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
b170: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
b180: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
b190: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
b1a0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
b1b0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
b1c0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
b1d0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
b1e0: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
b1f0: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
b200: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
b210: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
b220: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
b230: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
b240: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
b250: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
b260: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
b270: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
b280: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
b290: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
b2a0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
b2b0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
b2c0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
b2d0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
b2e0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
b2f0: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
b300: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
b310: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
b320: 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61  pFrame = p->pFra
b330: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
b340: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
b350: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
b360: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
b370: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
b380: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
b390: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
b3a0: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
b3b0: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
b3c0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
b3d0: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
b3e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b3f0: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
b400: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
b410: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
b420: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
b430: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
b440: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
b450: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
b460: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
b470: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
b480: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
b490: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
b4a0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
b4b0: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
b4c0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
b4d0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
b4e0: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
b4f0: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
b500: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
b510: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
b520: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
b530: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
b540: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDel);.  }.}../
b550: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
b560: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
b570: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
b580: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
b590: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
b5a0: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
b5b0: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
b5c0: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
b5d0: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
b5e0: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
b5f0: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
b600: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
b610: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
b620: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
b630: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
b640: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b650: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
b660: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
b670: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
b680: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
b690: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
b6a0: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
b6b0: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
b6c0: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
b6d0: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
b6e0: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
b6f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b700: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
b710: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
b720: 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73  sr==0 || p->apCs
b730: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  r[i]==0 );.  for
b740: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
b750: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
b760: 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e  ->aMem==0 || p->
b770: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
b780: 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69  EM_Null );.#endi
b790: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
b7a0: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
b7b0: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
b7c0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
b7d0: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
b7e0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
b7f0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
b800: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
b810: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
b820: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
b830: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
b840: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
b850: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
b860: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
b870: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
b880: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
b890: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
b8a0: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
b8b0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
b8c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
b8d0: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
b8e0: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
b8f0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
b900: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
b910: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
b920: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
b930: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
b940: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
b950: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
b960: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
b970: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
b980: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
b990: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
b9a0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
b9b0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
b9c0: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
b9d0: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
b9e0: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
b9f0: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
ba00: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
ba10: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ba20: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
ba30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
ba40: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
ba50: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
ba60: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
ba70: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
ba80: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
ba90: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
baa0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
bab0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
bac0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
bad0: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
bae0: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
baf0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
bb00: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
bb10: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
bb20: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
bb30: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
bb40: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
bb50: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
bb60: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
bb70: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
bb80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
bb90: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
bba0: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
bbb0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
bbc0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
bbd0: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
bbe0: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
bbf0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
bc00: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
bc10: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
bc20: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
bc30: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
bc40: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
bc50: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
bc60: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
bc70: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
bc80: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
bcb0: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
bcc0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
bcf0: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
bd00: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
bd10: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd30: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
bd40: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
bd50: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
bd60: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
bd70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
bd80: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
bd90: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
bda0: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
bdb0: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
bdc0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
bdd0: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
bde0: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
bdf0: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
be00: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
be10: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
be20: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
be30: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
be40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
be50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
be60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
be70: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
be80: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
be90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bea0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
beb0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
bec0: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
bed0: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
bee0: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
bef0: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
bf00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
bf10: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
bf20: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
bf30: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
bf40: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
bf50: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
bf60: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
bf70: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
bf80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bf90: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
bfa0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
bfb0: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
bfc0: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
bfd0: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
bfe0: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
bff0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
c000: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
c010: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
c020: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
c030: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
c040: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
c050: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
c060: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
c070: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
c080: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
c090: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
c0a0: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
c0b0: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
c0c0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
c0d0: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
c0e0: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
c0f0: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
c100: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
c110: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
c120: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
c130: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
c140: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
c150: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
c160: 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
c170: 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
c180: 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
c190: 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
c1a0: 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
c1b0: 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
c1c0: 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
c1d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
c1e0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
c1f0: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
c200: 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
c210: 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
c220: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
c230: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
c240: 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
c250: 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
c260: 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
c270: 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
c280: 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
c290: 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
c2a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c2b0: 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
c2c0: 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
c2d0: 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
c2e0: 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
c2f0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
c300: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
c310: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
c320: 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
c330: 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a   &p->zErrMsg);..
c340: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
c350: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
c360: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
c370: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
c380: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
c390: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
c3a0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
c3b0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
c3c0: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
c3d0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
c3e0: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
c3f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
c400: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
c410: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
c420: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
c430: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
c440: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
c450: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
c460: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
c470: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
c480: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
c490: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
c4a0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
c4b0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
c4c0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
c4d0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
c4e0: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
c4f0: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
c500: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
c510: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
c520: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
c530: 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ++;.      rc = s
c540: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
c550: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
c560: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
c570: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c580: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c590: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
c5a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
c5b0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
c5c0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
c5d0: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
c5e0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
c5f0: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
c600: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
c610: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
c620: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
c630: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
c640: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
c650: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c670: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
c680: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
c690: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
c6a0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
c6b0: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
c6c0: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
c6d0: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
c6e0: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
c6f0: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
c700: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
c710: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
c720: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
c730: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
c740: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
c750: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
c760: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
c770: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
c780: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
c790: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
c7a0: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
c7b0: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
c7c0: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
c7d0: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
c7e0: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
c7f0: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
c800: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
c810: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
c820: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
c830: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
c840: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
c850: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
c860: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
c870: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
c880: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
c890: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
c8a0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
c8b0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
c8c0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
c8d0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
c8e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c8f0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
c900: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
c910: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c920: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
c930: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
c940: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
c950: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
c960: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
c970: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
c980: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
c990: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
c9a0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
c9b0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
c9c0: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
c9d0: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
c9e0: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
c9f0: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
ca00: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
ca10: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
ca20: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
ca30: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
ca40: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
ca50: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
ca60: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
ca70: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
ca80: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
ca90: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
caa0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
cab0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
cac0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cad0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
cae0: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
caf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
cb00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cb10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cb20: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
cb30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
cb40: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
cb50: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
cb60: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
cb70: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
cb80: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
cb90: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
cba0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
cbb0: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
cbc0: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
cbd0: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
cbe0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
cbf0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
cc00: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
cc10: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
cc20: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
cc30: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
cc40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
cc50: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
cc60: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
cc70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
cc80: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
cc90: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
cca0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
ccb0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
ccc0: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
ccd0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
cce0: 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
ccf0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
cd00: 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   res;..    /* Se
cd10: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
cd20: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cd30: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
cd40: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
cd50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
cd60: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
cd70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
cd80: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
cd90: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
cda0: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73  dom);.      zMas
cdb0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
cdc0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25  intf(db, "%s-mj%
cdd0: 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c  08X", zMainFile,
cde0: 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66   iRandom&0x7ffff
cdf0: 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fff);.      if( 
ce00: 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !zMaster ){.    
ce10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
ce30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ce40: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
ce50: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
ce60: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
ce70: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
ce80: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
ce90: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
cea0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ceb0: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
cec0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
ced0: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
cee0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
cef0: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
cf00: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
cf10: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
cf20: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
cf30: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
cf40: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
cf50: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
cf60: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
cf70: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
cf80: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
cf90: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
cfa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cfb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
cfc0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
cfd0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cfe0: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
cff0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
d000: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
d010: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
d020: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
d030: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
d040: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
d050: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d060: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
d070: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
d080: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
d090: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d0a0: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
d0b0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
d0c0: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
d0d0: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
d0e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d0f0: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
d100: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
d110: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
d120: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
d130: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
d140: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
d150: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
d160: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
d170: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
d180: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
d190: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
d1a0: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
d1b0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
d1c0: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
d1d0: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
d1e0: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
d1f0: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
d200: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
d210: 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
d220: 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
d230: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
d240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d250: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
d260: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
d270: 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
d280: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
d290: 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
d2a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
d2b0: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
d2c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
d2d0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d2e0: 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
d2f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
d300: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
d310: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
d320: 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
d330: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
d340: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
d350: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
d370: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
d380: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
d390: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
d3a0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
d3b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d3c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
d3d0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
d3e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d400: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
d410: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d420: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
d430: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
d440: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
d450: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
d460: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
d470: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d480: 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
d490: 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
d4a0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
d4b0: 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
d4c0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
d4d0: 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
d4e0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d4f0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
d500: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
d510: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
d520: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d530: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
d540: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
d550: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
d560: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
d570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
d580: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
d590: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
d5a0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
d5b0: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
d5c0: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
d5d0: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
d5e0: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
d5f0: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
d600: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d610: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
d620: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
d630: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
d640: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
d650: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
d660: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d670: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
d680: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
d690: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
d6a0: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
d6b0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
d6c0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d6d0: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
d6e0: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
d6f0: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
d700: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
d710: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
d720: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
d730: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
d740: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
d750: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d760: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
d770: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
d780: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
d790: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
d7a0: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
d7b0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
d7c0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d7d0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d7e0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
d7f0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
d800: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
d810: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
d820: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d830: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
d840: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
d850: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
d860: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
d870: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
d880: 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
d890: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
d8a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
d8b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d8c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d8d0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
d8e0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d8f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
d900: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
d910: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
d920: 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
d930: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
d940: 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
d950: 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
d960: 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
d970: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
d980: 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
d990: 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
d9a0: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
d9b0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
d9c0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
d9d0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
d9e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d9f0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
da00: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
da10: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
da20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
da30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
da40: 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
da50: 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
da60: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
da70: 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
da80: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
da90: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
daa0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
dab0: 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
dac0: 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
dad0: 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
dae0: 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
daf0: 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
db00: 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
db10: 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
db20: 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
db30: 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
db40: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
db50: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
db60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
db70: 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
db80: 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
db90: 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
dba0: 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
dbb0: 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
dbc0: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
dbd0: 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
dbe0: 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
dbf0: 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
dc00: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
dc10: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
dc20: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
dc30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dc40: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
dc50: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
dc60: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
dc70: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
dc80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
dc90: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
dca0: 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20  aseTwo(pBt);.   
dcb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
dcc0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
dcd0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
dce0: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
dcf0: 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
dd00: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
dd10: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
dd20: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
dd30: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
dd40: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
dd50: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  at the sqlite3.a
dd60: 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75  ctiveVdbeCnt cou
dd70: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
dd80: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
dd90: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
dda0: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
ddb0: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
ddc0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
ddd0: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
dde0: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
ddf0: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
de00: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
de10: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
de20: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
de30: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
de40: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
de50: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
de60: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
de70: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
de80: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
de90: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
dea0: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
deb0: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
dec0: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
ded0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
dee0: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
def0: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
df00: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
df10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
df20: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
df30: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
df40: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
df50: 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
df60: 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
df70: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
df80: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
df90: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
dfa0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
dfb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
dfc0: 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64  ite==db->writeVd
dfd0: 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65  beCnt );.}.#else
dfe0: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
dff0: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
e000: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
e010: 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61   every Btree tha
e020: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  t in database co
e030: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63  nnection db whic
e040: 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  h .** has been m
e050: 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20  odified, "trip" 
e060: 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61  or invalidate ea
e070: 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20  ch cursor in.** 
e080: 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74  that Btree might
e090: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
e0a0: 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ied so that the 
e0b0: 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65  cursor.** can ne
e0c0: 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69  ver be used agai
e0d0: 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  n.  This happens
e0e0: 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
e0f0: 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65  .*** occurs.  We
e100: 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c   have to trip al
e110: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73  l the other curs
e120: 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72  ors, even.** cur
e130: 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56  sor from other V
e140: 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  Ms in different 
e150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e160: 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74  ions,.** so that
e170: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72   none of them tr
e180: 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74  y to use the dat
e190: 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a  a at which they.
e1a0: 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67  ** were pointing
e1b0: 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d   and which now m
e1c0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61  ay have been cha
e1d0: 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74  nged due.** to t
e1e0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
e1f0: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74  ** Remember that
e200: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20   a rollback can 
e210: 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f  delete tables co
e220: 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65  mplete and.** re
e230: 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e  order rootpages.
e240: 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73    So it is not s
e250: 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74  ufficient just t
e260: 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74  o save.** the st
e270: 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
e280: 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  r.  We have to i
e290: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75  nvalidate the cu
e2a0: 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20  rsor.** so that 
e2b0: 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  it is never used
e2c0: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   again..*/.stati
e2d0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
e2e0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
e2f0: 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33  edBtrees(sqlite3
e300: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
e310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e320: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
e330: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
e340: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
e350: 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42  f( p && sqlite3B
e360: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
e370: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e380: 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
e390: 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41  sors(p, SQLITE_A
e3a0: 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  BORT);.    }.  }
e3b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
e3c0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
e3d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
e3e0: 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
e3f0: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
e400: 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
e410: 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
e420: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
e430: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
e440: 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
e450: 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
e460: 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
e470: 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
e480: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
e490: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
e4a0: 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
e4b0: 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
e4c0: 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
e4d0: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
e4e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
e4f0: 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mmtted..**.** If
e500: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
e510: 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
e520: 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
e530: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
e540: 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
e550: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
e560: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
e570: 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
e580: 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
e590: 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
e5a0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
e5b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e5c0: 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
e5d0: 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
e5e0: 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
e5f0: 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
e600: 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
e610: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
e620: 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
e630: 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
e640: 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
e650: 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
e660: 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
e670: 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73  ve occured, caus
e680: 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  ing an emergency
e690: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20   rollback..  ** 
e6a0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62  In this case (db
e6b0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29  ->nStatement==0)
e6c0: 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
e6d0: 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20  othing to do..  
e6e0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74  */.  if( db->nSt
e6f0: 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
e700: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
e710: 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
e720: 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
e730: 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
e740: 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
e750: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
e760: 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
e770: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
e780: 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
e790: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
e7a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e7b0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
e7c0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
e7d0: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
e7e0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
e7f0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e800: 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20   .      int rc2 
e810: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
e820: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e830: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e840: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
e850: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
e860: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
e870: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
e880: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
e890: 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
e8a0: 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
e8b0: 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
e8c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
e8d0: 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
e8e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e8f0: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
e900: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
e910: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
e920: 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
e930: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
e940: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
e950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e960: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
e970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e980: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
e990: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
e9a0: 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
e9b0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  t = 0;..    /* I
e9c0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
e9d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
e9e0: 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
e9f0: 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
ea00: 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
ea10: 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
ea20: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
ea30: 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
ea40: 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
ea50: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
ea60: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ea70: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
ea80: 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
ea90: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
eaa0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
eab0: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
eac0: 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
ead0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
eae0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
eaf0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
eb00: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
eb10: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
eb20: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
eb30: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
eb40: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
eb50: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
eb60: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
eb70: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
eb80: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
eb90: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
eba0: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
ebb0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
ebc0: 64 6f 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20 73  doing so it.** s
ebd0: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
ebe0: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
ebf0: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
ec00: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
ec10: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
ec20: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
ec30: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
ec40: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
ec50: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
ec60: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
ec70: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
ec80: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
ec90: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
eca0: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
ecb0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69  treeEnterAll() i
ecc0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  s invoked to set
ecd0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
ece0: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66   variables.** of
ecf0: 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64   all of BtShared
ed00: 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65   structures acce
ed10: 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64  ssible via the d
ed20: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
ed30: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
ed40: 74 68 20 74 68 65 20 56 4d 2e 20 4f 66 20 63 6f  th the VM. Of co
ed50: 75 72 73 65 20 6f 6e 6c 79 20 61 20 73 75 62 73  urse only a subs
ed60: 65 74 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  et of these stru
ed70: 63 74 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20 62  ctures.** will b
ed80: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
ed90: 65 20 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f 75  e VM, and we cou
eda0: 6c 64 20 75 73 65 20 56 64 62 65 2e 62 74 72 65  ld use Vdbe.btre
edb0: 65 4d 61 73 6b 20 74 6f 20 66 69 67 75 72 65 0a  eMask to figure.
edc0: 2a 2a 20 74 68 61 74 20 73 75 62 73 65 74 20 6f  ** that subset o
edd0: 75 74 2c 20 62 75 74 20 74 68 65 72 65 20 69 73  ut, but there is
ede0: 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f   no advantage to
edf0: 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a   doing so..**.**
ee00: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
ee10: 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64  t threadsafe and
ee20: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
ee30: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
ee40: 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ode, this.** fun
ee50: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
ee60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ee70: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ee80: 43 41 43 48 45 0a 76 6f 69 64 20 73 71 6c 69 74  CACHE.void sqlit
ee90: 65 33 56 64 62 65 4d 75 74 65 78 41 72 72 61 79  e3VdbeMutexArray
eea0: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
eeb0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
eec0: 44 53 41 46 45 0a 20 20 73 71 6c 69 74 65 33 42  DSAFE.  sqlite3B
eed0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e  treeMutexArrayEn
eee0: 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ter(&p->aMutex);
eef0: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
ef00: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 70 2d  BtreeEnterAll(p-
ef10: 3e 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23  >db);.#endif.}.#
ef20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
ef30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ef40: 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
ef50: 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
ef60: 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
ef70: 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
ef80: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
ef90: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
efa0: 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
efb0: 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
efc0: 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
efd0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
efe0: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
eff0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
f000: 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
f010: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
f020: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
f030: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
f040: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
f050: 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
f060: 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
f070: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
f080: 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
f090: 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
f0a0: 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
f0b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
f0c0: 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65  nd write.** an e
f0d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
f0e0: 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
f0f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
f100: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f110: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f120: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f130: 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
f140: 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
f150: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f160: 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
f170: 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44  ferred && db->nD
f180: 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c  eferredCons>0) |
f190: 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
f1a0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
f1b0: 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  >0) ){.    p->rc
f1c0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
f1d0: 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72  AINT;.    p->err
f1e0: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
f1f0: 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
f200: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
f210: 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65  rrMsg, db, "fore
f220: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
f230: 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
f240: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
f250: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
f260: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f270: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
f280: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f290: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
f2a0: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
f2b0: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
f2c0: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
f2d0: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
f2e0: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
f2f0: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
f300: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
f310: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
f320: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
f330: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
f340: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f350: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
f360: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
f370: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
f380: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
f390: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
f3a0: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
f3b0: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
f3c0: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
f3d0: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
f3e0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
f3f0: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
f400: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
f410: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
f420: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
f430: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
f440: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
f450: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
f460: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
f470: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
f480: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
f490: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
f4a0: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
f4b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
f4c0: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
f4d0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
f4e0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
f4f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
f510: 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
f520: 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
f530: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
f540: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
f550: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f560: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
f570: 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
f580: 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
f590: 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
f5a0: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
f5b0: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
f5c0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
f5d0: 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
f5e0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
f5f0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f600: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
f610: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
f620: 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
f630: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
f640: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
f650: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
f660: 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
f670: 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
f680: 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
f690: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
f6a0: 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
f6b0: 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
f6c0: 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
f6d0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
f6e0: 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
f6f0: 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
f700: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
f710: 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
f720: 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
f730: 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
f740: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
f750: 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
f760: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
f770: 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
f780: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f790: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
f7a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f7b0: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
f7c0: 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
f7d0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
f7e0: 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
f7f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f800: 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
f810: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
f820: 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
f830: 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
f840: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
f850: 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f  never started */
f860: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
f870: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
f880: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
f890: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
f8a0: 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
f8b0: 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
f8c0: 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
f8d0: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
f8e0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
f8f0: 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
f900: 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
f910: 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
f920: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
f930: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
f940: 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41  qlite3VdbeMutexA
f950: 72 72 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20  rrayEnter(p);.. 
f960: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
f970: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
f980: 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
f990: 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
f9a0: 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xff;.    assert(
f9b0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49   p->rc!=SQLITE_I
f9c0: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20  OERR_BLOCKED ); 
f9d0: 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e   /* This error n
f9e0: 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20  o longer exists 
f9f0: 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  */.    isSpecial
fa00: 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
fa10: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
fa20: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
fa50: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
fa60: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
fa70: 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
fa80: 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
fa90: 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
faa0: 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
fab0: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
fac0: 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
fad0: 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
fae0: 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
faf0: 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
fb00: 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
fb10: 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
fb20: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
fb30: 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
fb40: 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
fb50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
fb60: 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
fb70: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
fb80: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
fb90: 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
fba0: 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
fbb0: 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
fbc0: 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
fbd0: 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
fbe0: 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
fbf0: 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
fc00: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
fc10: 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
fc20: 63 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69  ccured while wri
fc30: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
fc40: 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
fc50: 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
fc60: 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
fc70: 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
fc80: 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
fc90: 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
fca0: 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
fcb0: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
fcc0: 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
fcd0: 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
fce0: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
fcf0: 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
fd00: 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
fd10: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
fd20: 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
fd30: 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
fd40: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
fd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
fd60: 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
fd70: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
fd80: 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
fd90: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
fda0: 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
fdb0: 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
fdc0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
fdd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fde0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
fdf0: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
fe00: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
fe10: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
fe20: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
fe30: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
fe40: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
fe50: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
fe60: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
fe70: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
fe80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
fe90: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
fea0: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
feb0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
fec0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
fed0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
fee0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
fef0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
ff00: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
ff10: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
ff20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ff30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
ff40: 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
ff50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
ff60: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
ff70: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
ff80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
ff90: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
ffa0: 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
ffb0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
ffc0: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
ffd0: 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
ffe0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
fff0: 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
10000 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
10010 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
10020 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
10030 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
10040 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
10050 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
10060 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
10070 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
10080 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
10090 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
100a0 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
100b0 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
100c0 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
100d0 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
100e0 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
100f0 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77  t .     && db->w
10100 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d  riteVdbeCnt==(p-
10110 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
10120 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
10130 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10140 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
10150 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
10160 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
10170 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10180 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
10190 46 6b 28 70 2c 20 31 29 20 29 7b 0a 20 20 20 20  Fk(p, 1) ){.    
101a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
101b0 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76  eeMutexArrayLeav
101c0 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20  e(&p->aMutex);. 
101d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
101e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
101f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10200 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
10210 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
10220 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
10230 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
10240 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20   .        ** or 
10250 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
10260 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
10270 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
10280 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
10290 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
102a0 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
102b0 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
102c0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
102d0 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
102e0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
102f0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
10300 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
10310 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , p);.        if
10320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
10330 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  Y ){.          s
10340 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
10350 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
10360 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
10370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10380 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
10390 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
103a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
103b0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
103c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
103d0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
103e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
103f0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
10400 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
10410 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10420 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
10430 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
10440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
10450 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
10460 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
10470 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
10480 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
10490 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
104a0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
104b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
104c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
104d0 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
104e0 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
104f0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
10500 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
10510 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
10520 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
10530 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
10540 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
10550 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
10560 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
10570 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10580 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
10590 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
105a0 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
105b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
105c0 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
105d0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
105e0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
105f0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
10600 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
10610 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
10620 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
10630 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
10640 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
10650 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
10660 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
10670 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
10680 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
10690 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
106a0 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
106b0 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
106c0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
106d0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
106e0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
106f0 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
10700 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
10710 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
10720 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
10730 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
10740 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
10750 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
10760 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   code..    **.  
10770 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 73    ** Note that s
10780 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
10790 74 61 74 65 6d 65 6e 74 28 29 20 63 61 6e 20 6f  tatement() can o
107a0 6e 6c 79 20 66 61 69 6c 20 69 66 20 65 53 74 61  nly fail if eSta
107b0 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20  tementOp.    ** 
107c0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
107d0 4c 42 41 43 4b 2e 20 20 42 75 74 20 69 66 20 70  LBACK.  But if p
107e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
107f0 74 68 65 6e 20 65 53 74 61 74 65 6d 65 6e 74 4f  then eStatementO
10800 70 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 65  p.    ** must be
10810 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10820 53 45 2e 20 20 48 65 6e 63 65 20 74 68 65 20 4e  SE.  Hence the N
10830 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  EVER(p->rc==SQLI
10840 54 45 5f 4f 4b 29 20 69 6e 20 0a 20 20 20 20 2a  TE_OK) in .    *
10850 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
10860 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
10870 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
10880 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
10890 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
108a0 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
108b0 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
108c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
108d0 20 20 20 20 61 73 73 65 72 74 28 20 65 53 74 61      assert( eSta
108e0 74 65 6d 65 6e 74 4f 70 3d 3d 53 41 56 45 50 4f  tementOp==SAVEPO
108f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
10900 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
10910 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  R(p->rc==SQLITE_
10920 4f 4b 29 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  OK) || p->rc==SQ
10930 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
10940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
10950 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
10960 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10970 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
10980 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
10990 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
109a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
109b0 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
109c0 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
109d0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
109e0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
109f0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
10a00 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
10a10 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
10a20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
10a30 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
10a40 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
10a50 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
10a60 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
10a70 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
10a80 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
10a90 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
10aa0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
10ab0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
10ac0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
10ad0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
10ae0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
10af0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
10b00 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
10b10 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
10b20 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
10b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b40 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
10b50 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
10b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10b80 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
10b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
10ba0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
10bb0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
10bc0 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
10bd0 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
10be0 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
10bf0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
10c00 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
10c10 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
10c20 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
10c30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10c40 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
10c50 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
10c60 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
10c70 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
10c80 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
10c90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10ca0 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
10cb0 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
10cc0 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
10cd0 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78  Leave(&p->aMutex
10ce0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
10cf0 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
10d00 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
10d10 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
10d20 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
10d30 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
10d40 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
10d50 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  veVdbeCnt--;.   
10d60 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
10d70 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77  y ){.      db->w
10d80 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  riteVdbeCnt--;. 
10d90 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
10da0 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
10db0 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  nt>=db->writeVdb
10dc0 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  eCnt );.  }.  p-
10dd0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
10de0 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
10df0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
10e00 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
10e10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10e20 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
10e30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
10e40 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
10e50 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
10e60 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
10e70 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
10e80 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
10e90 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
10ea0 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
10eb0 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
10ec0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
10ed0 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
10ee0 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
10ef0 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
10f00 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
10f10 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
10f20 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
10f30 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
10f40 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
10f50 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
10f60 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
10f70 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
10f80 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
10f90 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
10fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10fb0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  OK;.}.../*.** Ea
10fc0 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
10fd0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
10fe0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
10ff0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
11000 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
11010 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
11020 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
11030 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
11040 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
11050 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
11060 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
11070 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
11080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
11090 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
110a0 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
110b0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
110c0 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
110d0 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
110e0 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
110f0 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
11100 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
11110 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
11120 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11130 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
11140 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
11150 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
11160 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
11170 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
11180 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
11190 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
111a0 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
111b0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
111c0 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
111d0 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
111e0 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
111f0 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
11200 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
11210 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
11220 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
11230 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
11240 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
11250 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
11260 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
11270 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
11280 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
11290 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
112a0 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
112b0 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
112c0 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
112d0 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
112e0 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
112f0 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
11300 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
11310 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
11320 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
11330 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
11340 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
11350 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
11360 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
11370 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
11380 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
11390 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
113a0 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
113b0 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
113c0 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
113d0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
113e0 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
113f0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
11400 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
11410 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
11420 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
11430 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45  ){.    if( p->zE
11440 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
11450 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
11460 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
11470 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
11480 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c  Str(db->pErr,-1,
11490 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54  p->zErrMsg,SQLIT
114a0 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52  E_UTF8,SQLITE_TR
114b0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
114c0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
114d0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
114e0 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d  db->errCode = p-
114f0 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >rc;.      sqlit
11500 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
11510 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
11520 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
11530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
11540 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >rc ){.      sql
11550 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
11560 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  >rc, 0);.    }el
11570 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
11580 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
11590 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E_OK, 0);.    }.
115a0 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
115b0 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
115c0 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
115d0 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
115e0 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
115f0 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
11600 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
11610 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
11620 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
11630 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
11640 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
11650 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
11660 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
11670 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
11680 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
11690 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
116a0 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
116b0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
116c0 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
116d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
116e0 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
116f0 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
11700 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
11710 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
11720 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
11730 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
11740 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
11750 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
11760 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
11770 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
11780 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
11790 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
117a0 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
117b0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
117c0 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
117d0 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
117e0 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
117f0 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
11800 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
11810 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
11820 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
11830 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
11840 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
11850 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
11860 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
11870 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
11880 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
11890 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
118a0 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
118b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
118c0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
118d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
118e0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
118f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
11900 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
11910 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
11920 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
11930 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
11940 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
11950 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
11960 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
11970 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
11980 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
11990 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
119a0 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
119b0 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
119c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
119d0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
119e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
119f0 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
11a00 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
11a10 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
11a20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
11a30 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
11a40 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
11a50 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
11a60 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
11a70 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
11a80 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
11a90 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
11aa0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
11ab0 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
11ac0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11ad0 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
11ae0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
11af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11b00 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
11b10 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
11b20 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
11b30 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
11b40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
11b50 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
11b60 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
11b70 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
11b80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11b90 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
11ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11bb0 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
11bc0 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
11bd0 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
11be0 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
11bf0 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
11c00 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
11c10 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
11c20 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
11c30 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
11c40 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
11c50 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
11c60 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
11c70 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
11c80 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
11c90 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
11ca0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
11cb0 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
11cc0 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
11cd0 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
11ce0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
11cf0 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
11d00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
11d10 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
11d20 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
11d30 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
11d40 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
11d50 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29  &(((u32)1)<<i)))
11d60 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
11d70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
11d80 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
11d90 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
11da0 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
11db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
11dc0 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
11dd0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11de0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
11df0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11e00 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
11e10 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
11e20 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20  rgument..** The 
11e30 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
11e40 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11e50 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
11e60 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
11e70 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
11e80 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
11e90 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
11ea0 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
11eb0 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
11ec0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
11ed0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
11ee0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
11ef0 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  eObject(sqlite3 
11f00 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
11f10 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
11f20 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73  b, *pNext;.  ass
11f30 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
11f40 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
11f50 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
11f60 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
11f70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
11f80 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
11f90 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
11fa0 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
11fb0 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
11fc0 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
11fd0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
11fe0 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
11ff0 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
12000 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
12010 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
12020 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12030 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
12040 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
12050 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
12060 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
12070 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
12080 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
12090 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
120a0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
120b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
120c0 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
120d0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
120e0 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ree);.  sqlite3D
120f0 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
12100 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
12110 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
12120 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
12130 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
12140 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
12150 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
12160 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
12170 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
12180 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
12190 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
121a0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
121b0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
121c0 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
121d0 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
121e0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
121f0 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
12200 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
12210 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
12220 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
12230 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
12240 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
12250 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ;.  sqlite3VdbeD
12260 65 6c 65 74 65 4f 62 6a 65 63 74 28 64 62 2c 20  eleteObject(db, 
12270 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  p);.}../*.** Mak
12280 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
12290 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
122a0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
122b0 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
122c0 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
122d0 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
122e0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
122f0 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
12300 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
12310 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
12320 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
12330 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
12340 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
12350 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
12360 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
12370 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
12380 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
12390 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
123a0 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
123b0 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
123c0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
123d0 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
123e0 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
123f0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
12400 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
12410 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
12420 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
12430 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
12440 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
12450 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
12460 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
12470 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
12480 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
12490 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
124a0 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
124b0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
124c0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
124d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
124e0 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
124f0 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
12500 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
12510 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
12520 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
12530 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
12540 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
12550 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
12560 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
12570 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
12580 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12590 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
125a0 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  acked(p->pCursor
125b0 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
125c0 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
125d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
125e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c  urn rc;.    p->l
125f0 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f  astRowid = p->mo
12600 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20  vetoTarget;.    
12610 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
12620 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12630 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e  PT_BKPT;.    p->
12640 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31  rowidIsValid = 1
12650 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
12660 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
12670 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
12680 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
12690 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
126a0 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
126b0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
126c0 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ALE;.  }else if(
126d0 20 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73   ALWAYS(p->pCurs
126e0 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68  or) ){.    int h
126f0 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74  asMoved;.    int
12700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
12710 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
12720 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61  (p->pCursor, &ha
12730 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28  sMoved);.    if(
12740 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12750 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65  .    if( hasMove
12760 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61  d ){.      p->ca
12770 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
12780 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70  E_STALE;.      p
12790 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
127a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
127b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
127c0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
127d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
127e0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
127f0 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
12800 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12810 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
12820 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
12830 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
12840 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a  dbeSerialPut().*
12850 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
12860 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65  ialGet().**.** e
12870 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
12880 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
12890 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
128a0 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
128b0 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
128c0 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
128d0 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
128e0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
128f0 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
12900 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
12910 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
12920 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
12930 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
12940 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
12950 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
12960 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
12970 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
12980 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
12990 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
129a0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
129b0 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
129c0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
129d0 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
129e0 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
129f0 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
12a00 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
12a10 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
12a20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
12a30 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
12a40 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
12a50 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
12a60 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
12a70 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
12a80 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
12a90 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c  a blob seperatel
12aa0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
12ab0 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
12ac0 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
12ad0 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
12ae0 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
12af0 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
12b00 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
12b10 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
12b20 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
12b30 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
12b40 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
12b60 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
12b70 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
12b80 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
12b90 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
12ba0 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
12bb0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
12bc0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
12bf0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
12c00 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
12c20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
12c30 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
12c40 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
12c50 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
12c60 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
12c70 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
12ca0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
12cb0 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
12cc0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
12cd0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
12ce0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
12d10 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
12d20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
12d30 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
12d40 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
12d50 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
12d60 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
12d70 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
12d80 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
12d90 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
12da0 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
12dd0 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
12de0 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
12df0 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
12e00 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
12e10 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
12e20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
12e30 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
12e40 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
12e50 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
12e60 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
12e70 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
12e80 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
12e90 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
12ea0 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
12eb0 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
12ec0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12ed0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
12ee0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
12ef0 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
12f00 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
12f10 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
12f20 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
12f30 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  at){.  int flags
12f40 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
12f50 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20    int n;..  if( 
12f60 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
12f70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
12f80 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
12f90 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f  MEM_Int ){.    /
12fa0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
12fb0 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32  ther to use 1, 2
12fc0 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65  , 4, 6 or 8 byte
12fd0 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65  s. */.#   define
12fe0 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69   MAX_6BYTE ((((i
12ff0 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c  64)0x00008000)<<
13000 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69  32)-1).    i64 i
13010 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
13020 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28    u64 u;.    if(
13030 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
13040 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20  && (i&1)==i ){. 
13050 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75       return 8+(u
13060 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  32)i;.    }.    
13070 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69  u = i<0 ? -i : i
13080 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  ;.    if( u<=127
13090 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
130a0 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
130b0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
130c0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
130d0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
130e0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
130f0 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
13100 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
13110 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
13120 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
13130 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
13140 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
13150 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
13160 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  ( pMem->db->mall
13170 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67  ocFailed || flag
13180 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
13190 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d  lob) );.  n = pM
131a0 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61  em->n;.  if( fla
131b0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
131c0 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e  .    n += pMem->
131d0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61  u.nZero;.  }.  a
131e0 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
131f0 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
13200 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
13210 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
13220 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13230 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
13240 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
13250 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
13260 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
13270 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
13280 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
13290 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
132a0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
132b0 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
132c0 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
132d0 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
132e0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
132f0 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
13300 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
13310 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
13320 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
13330 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
13340 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
13350 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
13360 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
13370 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
13380 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
13390 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
133a0 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
133b0 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
133c0 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
133d0 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
133e0 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
133f0 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
13400 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
13410 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13420 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
13430 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
13440 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
13450 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
13460 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
13470 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
13480 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
13490 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
134a0 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
134b0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
134c0 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
134d0 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
134e0 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
134f0 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
13500 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
13510 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
13520 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
13530 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
13540 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
13550 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
13560 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
13570 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
13580 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
13590 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
135a0 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
135b0 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
135c0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
135d0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
135e0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
135f0 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
13600 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
13610 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
13620 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
13630 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
13640 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
13650 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
13660 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
13670 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
13680 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
13690 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
136a0 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
136b0 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
136c0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
136d0 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
136e0 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
136f0 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
13700 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
13710 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
13720 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
13730 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
13740 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
13750 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
13760 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
13770 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
13780 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
13790 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
137a0 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
137b0 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
137c0 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
137d0 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
137e0 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
137f0 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
13800 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
13810 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
13820 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
13830 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
13840 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
13850 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
13860 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
13870 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
13880 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
13890 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
138a0 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
138b0 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
138c0 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
138d0 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
138e0 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
138f0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
13900 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
13910 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
13920 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
13930 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
13940 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
13950 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
13960 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
13970 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
13980 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
13990 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
139a0 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
139b0 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
139c0 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
139d0 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
139e0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
139f0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
13a00 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
13a10 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
13a20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
13a30 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
13a40 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
13a50 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
13a60 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
13a70 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
13a80 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
13a90 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
13aa0 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
13ab0 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
13ac0 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
13ad0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
13ae0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
13af0 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
13b00 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
13b10 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
13b20 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
13b30 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
13b40 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
13b50 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
13b60 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
13b70 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
13b80 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
13b90 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
13ba0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
13bb0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
13bc0 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
13bd0 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
13be0 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20  f[].  nBuf must 
13bf0 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72  always be.** lar
13c00 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
13c10 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
13c20 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ld.  Except, if 
13c30 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20  the field is.** 
13c40 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65  a blob with a ze
13c50 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20  ro-filled tail, 
13c60 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74  then buf[] might
13c70 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67   be just the rig
13c80 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f  ht.** size to ho
13c90 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78  ld everything ex
13ca0 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72  cept for the zer
13cb0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20  o-filled tail.  
13cc0 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f  If buf[].** is o
13cd0 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74  nly big enough t
13ce0 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a  o hold the non-z
13cf0 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e  ero prefix, then
13d00 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74   only write that
13d10 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20  .** prefix into 
13d20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62  buf[].  But if b
13d30 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e  uf[] is large en
13d40 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74  ough to hold bot
13d50 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20  h the.** prefix 
13d60 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65  and the tail the
13d70 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66  n write the pref
13d80 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74  ix and set the t
13d90 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65  ail to all.** ze
13da0 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ros..**.** Retur
13db0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13dc0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
13dd0 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
13de0 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
13df0 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
13e00 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
13e10 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
13e20 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
13e30 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
13e40 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
13e50 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
13e60 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
13e70 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
13e80 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20  *buf, int nBuf, 
13e90 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
13ea0 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75  ile_format){.  u
13eb0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  32 serial_type =
13ec0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13ed0 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c  alType(pMem, fil
13ee0 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32  e_format);.  u32
13ef0 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
13f00 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
13f10 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
13f20 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
13f30 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
13f40 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
13f50 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
13f60 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
13f70 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
13f80 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
13f90 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
13fa0 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
13fb0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
13fc0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
13fd0 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
13fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
13ff0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
14000 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
14010 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14020 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
14030 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
14040 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66  ( len<=(u32)nBuf
14050 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   );.    while( i
14060 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b  -- ){.      buf[
14070 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
14080 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
14090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
140a0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
140b0 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
140c0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
140d0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
140e0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
140f0 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
14100 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
14110 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
14120 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
14130 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
14140 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
14150 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
14160 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c  assert( pMem->n<
14170 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e  =nBuf );.    len
14180 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
14190 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
141a0 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69  ->z, len);.    i
141b0 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
141c0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
141d0 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e     len += pMem->
141e0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61  u.nZero;.      a
141f0 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29  ssert( nBuf>=0 )
14200 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20  ;.      if( len 
14210 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20  > (u32)nBuf ){. 
14220 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33         len = (u3
14230 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a  2)nBuf;.      }.
14240 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75        memset(&bu
14250 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c  f[pMem->n], 0, l
14260 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20  en-pMem->n);.   
14270 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
14280 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
14290 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
142a0 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
142b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
142c0 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
142d0 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
142e0 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
142f0 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
14300 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
14310 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
14320 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
14330 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14340 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20  s read..*/ .u32 
14350 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14360 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
14370 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
14380 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
14390 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
143a0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
143b0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
143c0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
143d0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
143e0 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
143f0 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
14400 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
14410 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
14420 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
14430 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
14440 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
14450 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
14460 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
14470 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
14480 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
14490 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
144a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
144b0 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
144c0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
144d0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
144e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
144f0 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
14500 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
14510 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
14520 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e  Mem->u.i = (sign
14530 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
14540 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14550 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14560 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14570 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
14580 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
14590 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
145a0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
145b0 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
145c0 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
145d0 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  1];.      pMem->
145e0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
145f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
14600 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14610 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
14620 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14630 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
14640 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
14650 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c  r)buf[0])<<16) |
14660 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62   (buf[1]<<8) | b
14670 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[2];.      pMe
14680 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
14690 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
146a0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
146b0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
146c0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
146d0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
146e0 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32  u.i = (buf[0]<<2
146f0 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
14700 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
14710 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
14720 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14730 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
14740 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 4;.    }.   
14750 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
14760 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14770 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  ger */.      u64
14780 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63   x = (((signed c
14790 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
147a0 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
147b0 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c  u32 y = (buf[2]<
147c0 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c  <24) | (buf[3]<<
147d0 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38  16) | (buf[4]<<8
147e0 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20  ) | buf[5];.    
147f0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
14800 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  y;.      pMem->u
14810 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
14820 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14830 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14840 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
14850 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
14860 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
14870 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14880 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
14890 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
148a0 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  t */.      u64 x
148b0 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23  ;.      u32 y;.#
148c0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
148d0 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
148e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
148f0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
14900 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
14910 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
14920 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
14930 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
14940 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  .      ** byte o
14950 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
14960 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
14970 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
14980 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  AT is.      ** d
14990 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
149a0 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
149b0 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
149c0 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20  are mixed.      
149d0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20  ** endian..     
149e0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
149f0 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
14a00 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
14a10 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61  )<<32;.      sta
14a20 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
14a30 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20   r1 = 1.0;.     
14a40 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
14a50 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
14a60 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
14a70 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14a80 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
14a90 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
14aa0 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
14ab0 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
14ac0 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b  .      x = (buf[
14ad0 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
14ae0 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
14af0 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
14b00 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d       y = (buf[4]
14b10 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c  <<24) | (buf[5]<
14b20 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c  <16) | (buf[6]<<
14b30 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20  8) | buf[7];.   
14b40 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
14b50 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   y;.      if( se
14b60 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
14b70 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e          pMem->u.
14b80 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
14b90 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
14ba0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
14bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14bc0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14bd0 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
14be0 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b  f(pMem->r)==8 );
14bf0 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78  .        swapMix
14c00 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
14c10 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
14c20 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73  (&pMem->r, &x, s
14c30 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20  izeof(x));.     
14c40 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14c50 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
14c60 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  em->r) ? MEM_Nul
14c70 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
14c80 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
14c90 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 8;.    }.    
14ca0 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
14cb0 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
14cc0 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
14cd0 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
14ce0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
14cf0 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
14d00 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14d10 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
14d20 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
14d30 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
14d40 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65     u32 len = (se
14d50 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
14d60 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
14d70 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
14d80 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65      pMem->n = le
14d90 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78  n;.      pMem->x
14da0 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Del = 0;.      i
14db0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30  f( serial_type&0
14dc0 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  x01 ){.        p
14dd0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
14de0 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  _Str | MEM_Ephem
14df0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14e00 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
14e10 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20  gs = MEM_Blob | 
14e20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
14e30 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
14e40 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  len;.    }.  }. 
14e50 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
14e60 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
14e70 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
14e80 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
14e90 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20 74   pKey[], parse t
14ea0 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74  he.** record int
14eb0 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  o a UnpackedReco
14ec0 72 64 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  rd structure.  R
14ed0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
14ee0 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75 63  to.** that struc
14ef0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
14f00 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
14f10 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 73   might provide s
14f20 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f 66 20  zSpace bytes of 
14f30 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
14f40 61 74 20 70 53 70 61 63 65 2e 20 20 54 68 69 73  at pSpace.  This
14f50 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 75 73   space can be us
14f60 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ed to hold the r
14f70 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65 50  eturned.** VDbeP
14f80 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72 75  arsedRecord stru
14f90 63 74 75 72 65 20 69 66 20 69 74 20 69 73 20 6c  cture if it is l
14fa0 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49 66  arge enough.  If
14fb0 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 69   it is.** not bi
14fc0 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65 20  g enough, space 
14fd0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
14fe0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
14ff0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  )..**.** The ret
15000 75 72 6e 65 64 20 73 74 72 75 63 74 75 72 65 20  urned structure 
15010 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
15020 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a   by a call to.**
15030 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
15040 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
15050 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 64  ()..*/ .Unpacked
15060 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
15070 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
15080 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
15090 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
150a0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
150b0 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
150c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
150e0 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
150f0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
15100 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
15110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
15120 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
15130 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
15140 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
15150 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
15160 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ble to hold the 
15170 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
15180 73 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20  szSpace         
15190 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
151a0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
151b0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
151c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
151d0 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
151e0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
151f0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
15200 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20 75 6e  d *p;  /* The un
15210 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 68  packed record th
15220 61 74 20 77 65 20 77 69 6c 6c 20 72 65 74 75 72  at we will retur
15230 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  n */.  int nByte
15240 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65  ;          /* Me
15250 6d 6f 72 79 20 73 70 61 63 65 20 6e 65 65 64 65  mory space neede
15260 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69 6e 20  d to hold p, in 
15270 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64  bytes */.  int d
15280 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
15290 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
152a0 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
152b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
152c0 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
152d0 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 6e  m *pMem;.  int n
152e0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Off;           /
152f0 2a 20 49 6e 63 72 65 61 73 65 20 70 53 70 61 63  * Increase pSpac
15300 65 20 62 79 20 74 68 69 73 20 6d 75 63 68 20 74  e by this much t
15310 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 20 69  o 8-byte align i
15320 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  t */.  .  /*.  *
15330 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69  * We want to shi
15340 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  ft the pointer p
15350 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68  Space up such th
15360 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20  at it is 8-byte 
15370 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68  aligned..  ** Th
15380 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63  us, we need to c
15390 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65  alculate a value
153a0 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20  , nOff, between 
153b0 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66  0 and 7, to shif
153c0 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20  t .  ** it by.  
153d0 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72  If pSpace is alr
153e0 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67  eady 8-byte alig
153f0 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64  ned, nOff should
15400 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20   be zero..  */. 
15410 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51   nOff = (8 - (SQ
15420 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
15430 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20  pSpace) & 7)) & 
15440 37 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d 20 6e  7;.  pSpace += n
15450 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63 65 20 2d  Off;.  szSpace -
15460 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74 65 20  = nOff;.  nByte 
15470 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
15480 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
15490 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
154a0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
154b0 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  +1);.  if( nByte
154c0 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20 20  >szSpace ){.    
154d0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
154e0 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
154f0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
15500 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
15510 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  rn 0;.    p->fla
15520 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs = UNPACKED_NE
15530 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43 4b  ED_FREE | UNPACK
15540 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
15550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
15560 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
15570 64 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20 70  d*)pSpace;.    p
15580 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
15590 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
155a0 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  .  }.  p->pKeyIn
155b0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
155c0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
155d0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
155e0 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 70  1;.  p->aMem = p
155f0 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
15600 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
15610 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
15620 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
15630 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
15640 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
15650 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
15660 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
15670 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
15680 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
15690 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75  ( idx<szHdr && u
156a0 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c  <p->nField && d<
156b0 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
156c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
156d0 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
156e0 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
156f0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
15700 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
15710 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
15720 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
15730 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
15740 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
15750 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
15760 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
15770 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15780 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
15790 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
157a0 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
157b0 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
157c0 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
157d0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
157e0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
157f0 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  u;.  return (voi
15800 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  d*)p;.}../*.** T
15810 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74  his routine dest
15820 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52  roys a UnpackedR
15830 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a 2f  ecord object..*/
15840 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
15850 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
15860 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65  ecord(UnpackedRe
15870 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 6e 74 20  cord *p){.  int 
15880 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a  i;.  Mem *pMem;.
15890 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
158a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
158b0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
158c0 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29 3b  _NEED_DESTROY );
158d0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d  .  for(i=0, pMem
158e0 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e  =p->aMem; i<p->n
158f0 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d  Field; i++, pMem
15900 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++){.    /* The 
15910 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  unpacked record 
15920 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 72  is always constr
15930 75 63 74 65 64 20 62 79 20 74 68 65 0a 20 20 20  ucted by the.   
15940 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 55   ** sqlite3VdbeU
15950 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
15960 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68  nction above, wh
15970 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20  ich makes all.  
15980 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64    ** strings and
15990 20 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20 20   blobs static.  
159a0 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
159b0 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20 20  elements are.   
159c0 20 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66 6f   ** ever transfo
159d0 72 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69  rmed, so there i
159e0 73 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e 67  s never anything
159f0 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 20   to delete..    
15a00 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
15a10 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20  (pMem->zMalloc) 
15a20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
15a30 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
15a40 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
15a50 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
15a60 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73 71  D_FREE ){.    sq
15a70 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
15a80 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
15a90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
15aa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
15ab0 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
15ac0 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
15ad0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
15ae0 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
15af0 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
15b00 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
15b10 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
15b20 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
15b30 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
15b40 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
15b50 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
15b60 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
15b70 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
15b80 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
15b90 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
15ba0 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65  ed by th OP_Make
15bb0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
15bc0 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
15bd0 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
15be0 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
15bf0 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
15c00 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
15c10 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
15c20 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  rd..**.** Key1 a
15c30 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
15c40 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
15c50 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
15c60 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65  f fields..** The
15c70 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20   key with fewer 
15c80 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c  fields is usuall
15c90 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20  y compares less 
15ca0 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e  than the .** lon
15cb0 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65  ger key.  Howeve
15cc0 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
15cd0 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20  D_INCRKEY flags 
15ce0 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74  in pPKey2 is set
15cf0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d  .** and the comm
15d00 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20  on prefixes are 
15d10 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31  equal, then key1
15d20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65   is less than ke
15d30 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65  y2..** Or if the
15d40 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f   UNPACKED_MATCH_
15d50 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73  PREFIX flag is s
15d60 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69  et and the prefi
15d70 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  xes are.** equal
15d80 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20  , then the keys 
15d90 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
15da0 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a  o be equal and.*
15db0 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f  * the parts beyo
15dc0 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
15dd0 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64  efix are ignored
15de0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55  ..**.** If the U
15df0 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
15e00 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65 74  OWID flag is set
15e10 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
15e20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68  byte of.** the h
15e30 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69  eader of pKey1 i
15e40 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69  s ignored.  It i
15e50 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 70  s assumed that p
15e60 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  Key1 is.** an in
15e70 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75  dex key, and thu
15e80 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f  s ends with a ro
15e90 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20  wid value.  The 
15ea0 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20  last byte.** of 
15eb0 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20  the header will 
15ec0 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68 65  therefore be the
15ed0 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
15ee0 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e  the rowid:.** on
15ef0 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c  e of 1, 2, 3, 4,
15f00 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d   5, 6, 8, or 9 -
15f10 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65 72   the integer ser
15f20 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68  ial types..** Th
15f30 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
15f40 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
15f50 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
15f60 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
15f70 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68  * By ignoring th
15f80 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  is last byte of 
15f90 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 66  the header, we f
15fa0 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  orce the compari
15fb0 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  son.** to ignore
15fc0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
15fd0 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a  e end of key1..*
15fe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
15ff0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
16000 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
16010 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
16020 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
16030 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
16040 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
16050 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
16060 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20  {.  int d1;     
16070 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
16080 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
16090 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
160a0 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
160b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
160c0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
160d0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
160e0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
160f0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
16100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16110 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
16120 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
16130 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
16140 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
16150 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
16160 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
16170 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
16180 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
16190 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
161a0 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
161b0 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
161c0 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  Info;.  mem1.enc
161d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
161e0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
161f0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
16200 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
16210 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
16220 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
16230 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
16240 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
16250 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
16260 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
16270 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
16280 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
16290 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
162a0 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
162b0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
162c0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
162d0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
162e0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
162f0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
16300 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
16310 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
16320 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
16330 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
16340 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
16350 62 65 20 75 73 65 64 20 69 6e 69 74 69 61 6c 69  be used initiali
16360 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
16370 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
16380 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
16390 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
163a0 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
163b0 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
163c0 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
163d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
163e0 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
163f0 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
16400 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
16410 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
16420 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
16430 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
16440 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16450 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
16460 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
16470 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
16480 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
16490 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
164a0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
164b0 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
164c0 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
164d0 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32  r1;.  if( pPKey2
164e0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
164f0 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
16500 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b  ){.    szHdr1--;
16510 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20  .  }.  nField = 
16520 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
16530 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c  ;.  while( idx1<
16540 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
16550 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  y2->nField ){.  
16560 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16570 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
16580 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
16590 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
165a0 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
165b0 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
165c0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
165d0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
165e0 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
165f0 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
16600 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16610 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
16620 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
16630 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  k;..    /* Extra
16640 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
16650 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
16660 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
16670 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16680 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
16690 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
166a0 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
166b0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
166c0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
166d0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
166e0 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
166f0 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f        i<nField ?
16720 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16730 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
16740 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
16750 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
16760 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
16770 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
16780 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w */..      /* I
16790 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
167a0 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
167b0 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
167c0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
167d0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
167e0 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64 20  der && i<nField 
167f0 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
16800 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
16810 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
16820 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
16830 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45     /* If the PRE
16840 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
16850 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66  is set and all f
16860 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65  ields except the
16870 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20   final.      ** 
16880 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65  rowid field were
16890 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65   equal, then cle
168a0 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  ar the PREFIX_SE
168b0 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65  ARCH flag and se
168c0 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65  t .      ** pPKe
168d0 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65  y2->rowid to the
168e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
168f0 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b  wid field in (pK
16900 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20  ey1, nKey1)..   
16910 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73     ** This is us
16920 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
16930 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20  nique opcode..  
16940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16950 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20   (pPKey2->flags 
16960 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
16970 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d  X_SEARCH) && i==
16980 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d  (pPKey2->nField-
16990 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  1) ){.        as
169a0 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64  sert( idx1==szHd
169b0 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20  r1 && rc );.    
169c0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
169d0 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  .flags & MEM_Int
169e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65   );.        pPKe
169f0 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e  y2->flags &= ~UN
16a00 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
16a10 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50  ARCH;.        pP
16a20 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65  Key2->rowid = me
16a30 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  m1.u.i;.      }.
16a40 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72      .      retur
16a50 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
16a60 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  i++;.  }..  /* N
16a70 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
16a80 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
16a90 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
16aa0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
16ab0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
16ac0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
16ad0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
16ae0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
16af0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
16b00 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
16b10 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
16b20 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
16b30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16b40 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
16b50 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
16b60 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
16b70 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
16b80 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
16b90 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
16ba0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
16bb0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
16bc0 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e  equal. If the UN
16bd0 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20  PACKED_INCRKEY. 
16be0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
16bf0 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20   then break the 
16c00 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20  tie by treating 
16c10 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a  key2 as larger..
16c20 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43    ** If the UPAC
16c30 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
16c40 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
16c50 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d  en keys with com
16c60 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a  mon prefixes.  *
16c70 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
16c80 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
16c90 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
16ca0 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
16cb0 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41  .  ** larger.  A
16cc0 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
16cd0 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
16ce0 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
16cf0 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  er.  ** if there
16d00 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65   is a difference
16d10 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16d20 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20   rc==0 );.  if( 
16d30 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
16d40 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
16d50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b   ){.    rc = -1;
16d60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
16d70 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
16d80 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
16d90 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61  CH ){.    /* Lea
16da0 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65  ve rc==0 */.  }e
16db0 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48  lse if( idx1<szH
16dc0 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  dr1 ){.    rc = 
16dd0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
16de0 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70  rc;.}. ../*.** p
16df0 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
16e00 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
16e10 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
16e20 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
16e30 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
16e40 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
16e50 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
16e60 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
16e70 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
16e80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16e90 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
16ea0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
16eb0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
16ec0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
16ed0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
16ee0 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
16ef0 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
16f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
16f10 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
16f20 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
16f30 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
16f40 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
16f50 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
16f60 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
16f70 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
16f80 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
16f90 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
16fa0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
16fb0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
16fc0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
16fd0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
16fe0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
16ff0 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
17000 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
17010 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
17020 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
17030 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
17040 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
17050 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  m, v;..  UNUSED_
17060 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a  PARAMETER(db);..
17070 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
17080 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
17090 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
170a0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
170b0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
170c0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
170d0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
170e0 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
170f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
17100 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
17110 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
17120 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
17130 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
17140 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
17150 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
17160 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
17170 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
17180 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
17190 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
171a0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
171b0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
171c0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
171d0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
171e0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
171f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
17200 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
17210 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
17220 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
17230 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
17240 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
17250 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
17260 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
17270 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
17280 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
17290 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
172a0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   */.  memset(&m,
172b0 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
172c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
172d0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
172e0 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
172f0 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
17300 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17310 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17320 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
17330 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
17340 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
17350 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
17360 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
17370 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
17380 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
17390 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
173a0 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
173b0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
173c0 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
173d0 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
173e0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
173f0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
17400 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
17410 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
17420 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
17430 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
17440 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
17450 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
17460 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
17470 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
17480 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
17490 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
174a0 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
174b0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
174c0 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
174d0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
174e0 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
174f0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
17500 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17510 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
17520 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17530 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
17540 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17550 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
17560 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
17570 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17580 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
17590 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
175a0 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
175b0 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
175c0 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
175d0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
175e0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
175f0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
17600 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17610 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
17620 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
17630 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
17640 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
17650 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
17660 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
17670 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17680 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17690 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
176a0 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
176b0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
176c0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
176d0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
176e0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
176f0 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
17700 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
17710 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
17720 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
17730 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
17740 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17750 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
17760 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
17770 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
17780 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
17790 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
177a0 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
177b0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
177c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
177d0 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
177e0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
177f0 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
17800 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
17810 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
17820 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
17830 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17840 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
17850 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
17860 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
17870 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
17880 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
17890 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
178a0 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
178b0 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
178c0 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
178d0 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
178e0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
178f0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
17900 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
17910 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
17920 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
17930 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
17940 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
17950 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
17960 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
17970 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
17980 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
17990 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
179a0 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
179b0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
179c0 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
179d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
179e0 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
179f0 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
17a00 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
17a10 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
17a20 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
17a30 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
17a40 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
17a50 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
17a60 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
17a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
17a80 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
17a90 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
17aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17ab0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
17ac0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
17ad0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
17ae0 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
17af0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
17b00 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f  ion of key to co
17b10 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
17b20 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
17b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b40 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
17b50 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
17b60 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
17b70 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
17b80 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
17b90 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
17ba0 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
17bb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17bc0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
17bd0 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
17be0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17bf0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
17c00 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
17c10 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
17c20 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
17c30 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
17c40 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
17c50 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
17c60 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
17c70 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
17c80 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
17c90 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
17ca0 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  say.  ** that bt
17cb0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
17cc0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
17cd0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
17ce0 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
17cf0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
17d00 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
17d10 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
17d20 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
17d30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17d40 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
17d50 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
17d60 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
17d70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
17d80 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
17d90 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
17da0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
17db0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
17dc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
17dd0 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
17de0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
17df0 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
17e00 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
17e10 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
17e20 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
17e30 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
17e40 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
17e50 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
17e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17e70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17e80 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
17e90 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
17ea0 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
17eb0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
17ec0 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
17ed0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
17ee0 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
17ef0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
17f00 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
17f10 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
17f20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
17f30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17f40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
17f50 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
17f60 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
17f70 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
17f80 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
17f90 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
17fa0 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
17fb0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
17fc0 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
17fd0 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
17fe0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
17ff0 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
18000 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
18010 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
18020 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
18030 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
18040 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
18050 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
18060 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18070 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
18080 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
18090 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
180a0 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
180b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
180c0 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
180d0 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
180e0 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
180f0 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
18100 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
18110 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
18120 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
18130 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
18140 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
18150 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
18160 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
18170 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
18180 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
18190 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
181a0 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
181b0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
181c0 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
181d0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
181e0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
181f0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
18200 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
18210 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
18220 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
18230 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
18240 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
18250 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
18260 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
18270 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
18280 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
18290 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
182a0 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
182b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
182c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
182d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
182e0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
182f0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
18300 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
18310 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
18320 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
18330 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
18340 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
18350 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
18360 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
18370 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
18380 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
18390 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
183a0 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
183b0 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
183c0 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
183d0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
183e0 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
183f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
18400 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
18410 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
18420 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
18430 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64  3VdbeGetValue(Vd
18440 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
18450 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
18460 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
18470 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
18480 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
18490 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
184a0 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
184b0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
184c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
184d0 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
184e0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
184f0 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
18500 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
18510 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
18520 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
18530 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
18540 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
18550 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
18560 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
18570 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18580 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
18590 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a  e((Mem *)pRet);.
185a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
185b0 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
185c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
185d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
185e0 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
185f0 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
18600 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
18610 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
18620 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
18630 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
18640 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
18650 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
18660 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
18670 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
18680 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18690 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
186a0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
186b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
186c0 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
186d0 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
186e0 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
186f0 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
18700 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
18710 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
18720 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a              -1));.  }.}.