/ Hex Artifact Content
Login

Artifact 5c4cd4be10b8247061f97b77fa2b0a23728d43ed:


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: 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 50 61 72    if( op==OP_Par
0f60: 73 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  seSchema ){.    
0f70: 2f 2a 20 41 6e 79 20 70 72 6f 67 72 61 6d 20 74  /* Any program t
0f80: 68 61 74 20 75 73 65 73 20 74 68 65 20 4f 50 5f  hat uses the OP_
0f90: 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f  ParseSchema opco
0fa0: 64 65 20 6e 65 65 64 73 20 74 6f 20 6c 6f 63 6b  de needs to lock
0fb0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 62 74 72 65  .    ** all btre
0fc0: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  es. */.    int j
0fd0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
0fe0: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  <p->db->nDb; j++
0ff0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  ) sqlite3VdbeUse
1000: 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 20 20  sBtree(p, j);.  
1010: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1020: 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f  DEBUG.  pOp->zCo
1030: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  mment = 0;.  if(
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
1050: 70 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  pTrace ) sqlite3
1060: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1070: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
1080: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
1090: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
10a0: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
10b0: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
10c0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
10d0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
10e0: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
10f0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
1100: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1110: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1120: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1130: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1140: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1150: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1180: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1190: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
11a0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
11b0: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
11c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
11d0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
11e0: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
11f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1200: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1210: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1220: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
1230: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1240: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
1250: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1260: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
1270: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
1280: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1290: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
12a0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
12b0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
12c0: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
12d0: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
12e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12f0: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1300: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1310: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1320: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
1330: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
1340: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
1350: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
1360: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
1370: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
1380: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13a0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
13b0: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
13c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
13d0: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
13e0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
13f0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
1400: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1410: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1420: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1430: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1440: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1450: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1460: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1470: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1480: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
14b0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
14c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
14d0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
14e0: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
14f0: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1500: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1520: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1530: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1540: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1550: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
1560: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1570: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1580: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1590: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
15a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
15b0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
15c0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
15d0: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
15e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
15f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1600: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1610: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1620: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1630: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1640: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1650: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
1660: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1670: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1680: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1690: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
16a0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
16b0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
16c0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
16d0: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
16e0: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
16f0: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1700: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1710: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1720: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1730: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1740: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1750: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1760: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1770: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1780: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1790: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
17a0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
17b0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
17c0: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
17d0: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
17e0: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
17f0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1800: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1810: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1820: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1830: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1840: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1850: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1860: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1870: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1880: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
1890: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
18a0: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
18b0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
18c0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
18d0: 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  T );.  if( i>=p-
18e0: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a  >nLabelAlloc ){.
18f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e      int n = p->n
1900: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35  LabelAlloc*2 + 5
1910: 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  ;.    p->aLabel 
1920: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1930: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
1940: 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20  p->aLabel,.     
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c    n*sizeof(p->aL
1980: 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70  abel[0]));.    p
1990: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20  ->nLabelAlloc = 
19a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
19b0: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ize(p->db, p->aL
19c0: 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e  abel)/sizeof(p->
19d0: 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a  aLabel[0]);.  }.
19e0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
19f0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1a00: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
1a10: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
1a20: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
1a30: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
1a40: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1a50: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1a60: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
1a70: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
1a80: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
1a90: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
1aa0: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
1ab0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
1ac0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
1ad0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1ae0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1af0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b  Vdbe *p, int x){
1b00: 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b  .  int j = -1-x;
1b10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1b20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1b30: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
1b40: 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e  ( j>=0 && j<p->n
1b50: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70  Label );.  if( p
1b60: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1b70: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70  p->aLabel[j] = p
1b80: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->nOp;.  }.}../*
1b90: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
1ba0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
1bb0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
1bc0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
1bd0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
1be0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
1bf0: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
1c00: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
1c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
1c20: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
1c30: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
1c40: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1c50: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
1c60: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
1c70: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1c80: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
1c90: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
1ca0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
1cb0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
1cc0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
1cd0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
1ce0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
1cf0: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
1d00: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
1d10: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1d20: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
1d30: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
1d40: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
1d50: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
1d60: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
1d70: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
1da0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
1db0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
1dc0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
1dd0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
1de0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
1df0: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
1e00: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
1e10: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
1e20: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
1e30: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1e40: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
1e50: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
1e60: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
1e70: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1e80: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
1e90: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1ea0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
1eb0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
1ec0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
1ed0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
1ee0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
1ef0: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f10: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
1f20: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
1f30: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
1f40: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1f50: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
1f60: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
1f70: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
1fa0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
1fb0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
1fc0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
1fd0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
1fe0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
1ff0: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2000: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2010: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2020: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2030: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2040: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2050: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2060: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
2070: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
2080: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2090: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
20a0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
20b0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
20c0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
20d0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
20e0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
20f0: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2100: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2110: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2120: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
2130: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
2140: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
2150: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
2160: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
2170: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
2180: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
2190: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
21a0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
21b0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
21c0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
21d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
21e0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
21f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2200: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2210: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2220: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2230: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
2240: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
2250: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
2260: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
2270: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
2280: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
2290: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
22a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
22b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
22c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
22d0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
22e0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
22f0: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2300: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2310: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2320: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
2330: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
2340: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
2350: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
2360: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
2370: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
2380: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
2390: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
23a0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
23b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
23c0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
23d0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
23e0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
23f0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2400: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2410: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2420: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
2430: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
2440: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
2450: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2460: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2470: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
2480: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2490: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
24a0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
24b0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
24c0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
24d0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
24e0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
24f0: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2500: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2510: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2520: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
2530: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
2540: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
2550: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
2560: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
2570: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
2580: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2590: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
25a0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
25b0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
25c0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
25d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25e0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
25f0: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2600: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2610: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2620: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
2630: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
2640: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
2650: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
2660: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
2670: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
2680: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2690: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
26a0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
26b0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
26c0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
26d0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
26e0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
26f0: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2700: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2710: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2720: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2730: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2740: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2750: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2760: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2770: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2780: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2790: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
27a0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
27b0: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
27c0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
27d0: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
27e0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
27f0: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2800: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2810: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2820: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2830: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2840: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2850: 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51   && (pOp->p1==SQ
2860: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2870: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41  && pOp->p2==OE_A
2880: 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20  bort)).    ){.  
2890: 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31      hasAbort = 1
28a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
28c0: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
28d0: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
28e0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
28f0: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
2900: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
2910: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
2920: 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d  cured..  ** If m
2930: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68  alloc failed, th
2940: 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c  en the while() l
2950: 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f  oop above may no
2960: 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a  t have iterated.
2970: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c    ** through all
2980: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73   opcodes and has
2990: 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74  Abort may be set
29a0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65   incorrectly. Re
29b0: 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66  turn.  ** true f
29c0: 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20  or this case to 
29d0: 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65  prevent the asse
29e0: 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c  rt() in the call
29f0: 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66  ers frame.  ** f
2a00: 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f  rom failing.  */
2a10: 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64  .  return ( v->d
2a20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a30: 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  || hasAbort==may
2a40: 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69  Abort );.}.#endi
2a50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2a60: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
2a70: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
2a80: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
2a90: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
2aa0: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
2ab0: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
2ac0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
2ad0: 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69  ive.** on jump i
2ae0: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61  nstructions.  Ea
2af0: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
2b00: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
2b10: 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  ve the.** label 
2b20: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
2b30: 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  2 value to its c
2b40: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
2b50: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
2b60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2b70: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
2b80: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
2b90: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
2ba0: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
2bb0: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
2bc0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
2bd0: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
2be0: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
2bf0: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
2c00: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
2c10: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
2c20: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
2c30: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
2c40: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
2c50: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
2c60: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
2c70: 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61  .** The Op.opfla
2c80: 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  gs field is set 
2c90: 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a  on all opcodes..
2ca0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2cb0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
2cc0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
2cd0: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
2ce0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
2cf0: 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41  rgs = *pMaxFuncA
2d00: 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  rgs;.  Op *pOp;.
2d10: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
2d20: 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  p->aLabel;.  p->
2d30: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
2d40: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
2d50: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
2d60: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
2d70: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
2d80: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
2d90: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20   pOp->opflags = 
2da0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
2db0: 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20  perty[opcode];. 
2dc0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2dd0: 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70  P_Function || op
2de0: 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70  code==OP_AggStep
2df0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
2e00: 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29  p->p5>nMaxArgs )
2e10: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
2e20: 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >p5;.    }else i
2e30: 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  f( (opcode==OP_T
2e40: 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f  ransaction && pO
2e50: 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63  p->p2!=0) || opc
2e60: 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29  ode==OP_Vacuum )
2e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f  {.      p->readO
2e80: 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  nly = 0;.#ifndef
2e90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ea0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
2eb0: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
2ec0: 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20  OP_VUpdate ){.  
2ed0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
2ee0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
2ef0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
2f00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2f10: 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20  ode==OP_VFilter 
2f20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  ){.      int n;.
2f30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2f40: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
2f50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f60: 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-1].opcode==O
2f70: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
2f80: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
2f90: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  1;.      if( n>n
2fa0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2fb0: 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20  gs = n;.#endif. 
2fc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
2fd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
2fe0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
2ff0: 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20  pOp->p2<0 ){.   
3000: 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f     assert( -1-pO
3010: 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20  p->p2<p->nLabel 
3020: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  );.      pOp->p2
3030: 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70   = aLabel[-1-pOp
3040: 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->p2];.    }.  }
3050: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3060: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
3070: 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20  l);.  p->aLabel 
3080: 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e  = 0;..  *pMaxFun
3090: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
30a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30b0: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
30c0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
30d0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
30e0: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
30f0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3100: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
3110: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3120: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3130: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
3140: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  >nOp;.}../*.** T
3150: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
3160: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
3170: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
3180: 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65  pcodes associate
3190: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64  d with.** the Vd
31a0: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
31b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
31c0: 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
31d0: 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
31e0: 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20  y.** to arrange 
31f0: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
3200: 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65   array to be eve
3210: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
3220: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65  ing the .** vdbe
3230: 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75  FreeOpArray() fu
3240: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  nction..**.** Be
3250: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
3260: 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20  *pnOp is set to 
3270: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
3280: 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74  tries in the ret
3290: 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20  urned.** array. 
32a0: 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20  Also, *pnMaxArg 
32b0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  is set to the la
32c0: 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72  rger of its curr
32d0: 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a  ent value and .*
32e0: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
32f0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56  entries in the V
3300: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
3310: 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78  y required to ex
3320: 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65  ecute the .** re
3330: 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a  turned program..
3340: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
3350: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
3360: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  y(Vdbe *p, int *
3370: 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  pnOp, int *pnMax
3380: 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Arg){.  VdbeOp *
3390: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
33a0: 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21  assert( aOp && !
33b0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
33c0: 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  led );..  /* Che
33d0: 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  ck that sqlite3V
33e0: 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77  dbeUsesBtree() w
33f0: 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e  as not called on
3400: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73   this VM */.  as
3410: 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61  sert( p->btreeMa
3420: 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f  sk==0 );..  reso
3430: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70  lveP2Values(p, p
3440: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f  nMaxArg);.  *pnO
3450: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  p = p->nOp;.  p-
3460: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  >aOp = 0;.  retu
3470: 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aOp;.}../*.**
3480: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
3490: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
34a0: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
34b0: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
34c0: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
34d0: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
34e0: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
34f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
3500: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
3510: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
3520: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
3530: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
3540: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
3550: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3560: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
3570: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f  Op + nOp > p->nO
3580: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
3590: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
35a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
35b0: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
35c0: 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e   if( ALWAYS(nOp>
35d0: 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  0) ){.    int i;
35e0: 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20  .    VdbeOpList 
35f0: 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70  const *pIn = aOp
3600: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3610: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b  <nOp; i++, pIn++
3620: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  ){.      int p2 
3630: 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20  = pIn->p2;.     
3640: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20   VdbeOp *pOut = 
3650: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b  &p->aOp[i+addr];
3660: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  .      pOut->opc
3670: 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64  ode = pIn->opcod
3680: 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  e;.      pOut->p
3690: 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20  1 = pIn->p1;.   
36a0: 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 28     if( p2<0 && (
36b0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
36c0: 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f  perty[pOut->opco
36d0: 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  de] & OPFLG_JUMP
36e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
36f0: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
3700: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
3710: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3720: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
3730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
3740: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
3750: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
3760: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3770: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
3780: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
3790: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
37a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
37b0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
37c0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  mment = 0;.     
37d0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
37e0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
37f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3800: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
3810: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
3820: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
3830: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
3840: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
3850: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
3860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3870: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3880: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P1 operand for
3890: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
38a0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
38b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
38c0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
38d0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
38e0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
38f0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
3900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3910: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
3920: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
3930: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
3940: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
3950: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3960: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
3970: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3980: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
3990: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
39a0: 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20  rt( addr>=0 );. 
39b0: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72   if( p->nOp>addr
39c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
39d0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
39e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
39f0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3a00: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
3a10: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3a20: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3a30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3a40: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
3a50: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
3a60: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3a70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3a80: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3a90: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3aa0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3ab0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
3ac0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  0 );.  if( p->nO
3ad0: 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  p>addr ){.    p-
3ae0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
3af0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
3b00: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3b10: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
3b20: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
3b30: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
3b40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3b50: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
3b60: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3b70: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3b80: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3b90: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
3ba0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3bb0: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3bc0: 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b  [addr].p3 = val;
3bd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3be0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3bf0: 66 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64  f the P5 operand
3c00: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
3c10: 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20  cently.** added 
3c20: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  operation..*/.vo
3c30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3c40: 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20  angeP5(Vdbe *p, 
3c50: 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  u8 val){.  asser
3c60: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( p!=0 );.  if(
3c70: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61   p->aOp ){.    a
3c80: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
3c90: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
3ca0: 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c  >nOp-1].p5 = val
3cb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
3cc0: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
3cd0: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
3ce0: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
3cf0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
3d00: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
3d10: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
3d20: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
3d30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3d40: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
3d50: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
3d60: 7b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  {.  assert( addr
3d70: 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=0 );.  sqlite3
3d80: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
3d90: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
3da0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
3db0: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
3dc0: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
3dd0: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
3de0: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
3df0: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
3e00: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
3e10: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
3e20: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
3e30: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71  meralFunction(sq
3e40: 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44  lite3 *db, FuncD
3e50: 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28  ef *pDef){.  if(
3e60: 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26 26   ALWAYS(pDef) &&
3e70: 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
3e80: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
3e90: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
3ea0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3eb0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Def);.  }.}..sta
3ec0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
3ed0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
3ee0: 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a   *, Op *, int);.
3ef0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
3f00: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
3f10: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
3f20: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c   void freeP4(sql
3f30: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34  ite3 *db, int p4
3f40: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b  type, void *p4){
3f50: 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20  .  if( p4 ){.   
3f60: 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20   assert( db );. 
3f70: 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70     switch( p4typ
3f80: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
3f90: 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63  P4_REAL:.      c
3fa0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
3fb0: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
3fc0: 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  MIC:.      case 
3fd0: 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20  P4_KEYINFO:.    
3fe0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
3ff0: 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AY:.      case P
4000: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
4010: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  F: {.        sql
4020: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4030: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
4040: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4050: 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46   case P4_MPRINTF
4060: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4070: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4080: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72  ==0 ) sqlite3_fr
4090: 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20  ee(p4);.        
40a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
40b0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 44 42       case P4_VDB
40c0: 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20  EFUNC: {.       
40d0: 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65   VdbeFunc *pVdbe
40e0: 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63  Func = (VdbeFunc
40f0: 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66   *)p4;.        f
4100: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
4110: 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75  tion(db, pVdbeFu
4120: 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20  nc->pFunc);.    
4130: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
4140: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
4150: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
4160: 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63  uxData(pVdbeFunc
4170: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
4180: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4190: 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20  pVdbeFunc);.    
41a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
41b0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
41c0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
41d0: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
41e0: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
41f0: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
4200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4210: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4220: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20  4_MEM: {.       
4230: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4240: 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Freed==0 ){.    
4250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
4260: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
4270: 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20  value*)p4);.    
4280: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4290: 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d       Mem *p = (M
42a0: 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  em*)p4;.        
42b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
42c0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
42d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
42e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
42f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4300: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4310: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4320: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20  VTAB : {.       
4330: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4340: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4350: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
4360: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
4370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4380: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
4390: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
43a0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
43b0: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
43c0: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
43d0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
43e0: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
43f0: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
4400: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
4410: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
4420: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
4430: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
4440: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
4450: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
4460: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
4470: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
4480: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
4490: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
44a0: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
44b0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
44c0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
44d0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
44e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
44f0: 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74  EBUG.      sqlit
4500: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
4510: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e  ->zComment);.#en
4520: 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  dif     .    }. 
4530: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
4540: 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a  ee(db, aOp);.}..
4550: 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53  /*.** Link the S
4560: 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74  ubProgram object
4570: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
4580: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
4590: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a  nto the linked.*
45a0: 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70  * list at Vdbe.p
45b0: 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73  SubProgram. This
45c0: 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f   list is used to
45d0: 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d   delete all sub-
45e0: 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63  program.** objec
45f0: 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69  ts when the VM i
4600: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  s no longer requ
4610: 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ired..*/.void sq
4620: 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62  lite3VdbeLinkSub
4630: 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56  Program(Vdbe *pV
4640: 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20  dbe, SubProgram 
4650: 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  *p){.  p->pNext 
4660: 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61  = pVdbe->pProgra
4670: 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f  m;.  pVdbe->pPro
4680: 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  gram = p;.}../*.
4690: 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f  ** Change N opco
46a0: 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  des starting at 
46b0: 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a  addr to No-ops..
46c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
46d0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
46e0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
46f0: 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  r, int N){.  if(
4700: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
4710: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
4720: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
4730: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4740: 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  >db;.    while( 
4750: 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65  N-- ){.      fre
4760: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4770: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4780: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  .      memset(pO
4790: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
47a0: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70  [0]));.      pOp
47b0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
47c0: 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b  op;.      pOp++;
47d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
47e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
47f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
4800: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
4810: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
4820: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
4830: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
4840: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
4850: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
4860: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
4870: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
4880: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
4890: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
48a0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
48b0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
48c0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
48d0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
48e0: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
48f0: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
4900: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
4910: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
4920: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
4930: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4940: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4950: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
4960: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
4970: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
4980: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
4990: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
49a0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
49b0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
49c0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a  es of zP4..**.**
49d0: 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46   If n==P4_KEYINF
49e0: 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  O it means that 
49f0: 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72  zP4 is a pointer
4a00: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4a10: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f  ructure..** A co
4a20: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
4a30: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
4a40: 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ure into memory 
4a50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
4a60: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c   sqlite3_malloc,
4a70: 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65   to be freed whe
4a80: 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69  n the Vdbe is fi
4a90: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50  nalized..** n==P
4aa0: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
4ab0: 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  F indicates that
4ac0: 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61   zP4 points to a
4ad0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
4ae0: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
4af0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20  memory that the 
4b00: 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69  caller has obtai
4b10: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
4b20: 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a  _malloc. The .**
4b30: 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
4b40: 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f  ot free the allo
4b50: 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  cation, it will 
4b60: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
4b70: 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e  e Vdbe is.** fin
4b80: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f  alized..** .** O
4b90: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
4ba0: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
4bb0: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
4bc0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
4bd0: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
4be0: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
4bf0: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
4c00: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
4c10: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
4c20: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
4c30: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
4c40: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
4c50: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
4c60: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
4c70: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
4c80: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
4c90: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
4ca0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4cb0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4cc0: 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P4(Vdbe *p, int 
4cd0: 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  addr, const char
4ce0: 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20   *zP4, int n){. 
4cf0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69   Op *pOp;.  sqli
4d00: 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
4d10: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20  t( p!=0 );.  db 
4d20: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
4d30: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
4d40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
4d50: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
4d60: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
4d70: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 20  led ){.    if ( 
4d80: 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26  n!=P4_KEYINFO &&
4d90: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a   n!=P4_VTAB ) {.
4da0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4db0: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
4dc0: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
4dd0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4de0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
4df0: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
4e00: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
4e10: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
4e20: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
4e30: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
4e40: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
4e50: 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70  ;.  freeP4(db, p
4e60: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
4e70: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
4e80: 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e  4.p = 0;.  if( n
4e90: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
4ea0: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
4eb0: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
4ec0: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
4ed0: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
4ee0: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
4ef0: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
4f00: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
4f10: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
4f20: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
4f30: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
4f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
4f50: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
4f60: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
4f70: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
4f80: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
4f90: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
4fa0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
4fb0: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
4fc0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
4fd0: 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c  o;.    int nFiel
4fe0: 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  d, nByte;..    n
4ff0: 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66  Field = ((KeyInf
5000: 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b  o*)zP4)->nField;
5010: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
5020: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b  eof(*pKeyInfo) +
5030: 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65   (nField-1)*size
5040: 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of(pKeyInfo->aCo
5050: 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b  ll[0]) + nField;
5060: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
5070: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
5080: 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aw(0, nByte);.  
5090: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
50a0: 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
50b0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
50c0: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f  ){.      u8 *aSo
50d0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d  rtOrder;.      m
50e0: 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 4b 65  emcpy((char*)pKe
50f0: 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74  yInfo, zP4, nByt
5100: 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20  e - nField);.   
5110: 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20     aSortOrder = 
5120: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5130: 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rder;.      if( 
5140: 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  aSortOrder ){.  
5150: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
5160: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e  aSortOrder = (un
5170: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b  signed char*)&pK
5180: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46  eyInfo->aColl[nF
5190: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ield];.        m
51a0: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e  emcpy(pKeyInfo->
51b0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72  aSortOrder, aSor
51c0: 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b  tOrder, nField);
51d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
51e0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
51f0: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
5210: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
5220: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
5230: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
5240: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
5250: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
5260: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
5270: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5280: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5290: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
52a0: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
52b0: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
52c0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
52d0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
52e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
52f0: 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c  P4_VTAB;.    sql
5300: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
5310: 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20  able *)zP4);.   
5320: 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c   assert( ((VTabl
5330: 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d  e *)zP4)->db==p-
5340: 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  >db );.  }else i
5350: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
5360: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5370: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5380: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
5390: 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b  char)n;.  }else{
53a0: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
53b0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
53c0: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
53d0: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
53e0: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
53f0: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
5400: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5410: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a  DYNAMIC;.  }.}..
5420: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
5430: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5440: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74  comment on the t
5450: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5460: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
5470: 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72  on.  Or.** inser
5480: 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64  t a No-op and ad
5490: 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f  d the comment to
54a0: 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75   that new instru
54b0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20  ction.  This.** 
54c0: 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65  makes the code e
54d0: 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75  asier to read du
54e0: 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20  ring debugging. 
54f0: 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61   None of this ha
5500: 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72  ppens.** in a pr
5510: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a  oduction build..
5520: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5530: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
5540: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5550: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5560: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5570: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
5580: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5590: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
55a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
55b0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
55c0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
55d0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
55e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
55f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
5600: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
5610: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
5620: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
5630: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5640: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
5650: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5660: 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d   *pz);.    *pz =
5670: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5680: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
5690: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
56a0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
56b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
56c0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
56d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
56e0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
56f0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
5700: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
5710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
5720: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
5730: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5740: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
5750: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
5760: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
5770: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5780: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
5790: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
57a0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
57b0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
57c0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
57d0: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
57e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
57f0: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
5800: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
5810: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
5820: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
5830: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
5840: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
5850: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
5860: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
5870: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5880: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
5890: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
58a0: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
58b0: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
58c0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
58d0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
58e0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
58f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5900: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
5910: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
5920: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
5930: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
5940: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
5950: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
5960: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5970: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
5980: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
5990: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
59a0: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
59b0: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
59c0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
59d0: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
59e0: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
59f0: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
5a00: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
5a10: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
5a20: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
5a30: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5a40: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5a50: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
5a60: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5a70: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
5a80: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
5a90: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
5aa0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
5ab0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
5ac0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
5ad0: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
5ae0: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
5af0: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
5b00: 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62  lgrind..**.** Ab
5b10: 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53  out the #ifdef S
5b20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5b30: 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  :  Normally, thi
5b40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
5b50: 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c  er called.** unl
5b60: 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54  ess p->nOp>0.  T
5b70: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
5b80: 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66  n the absense of
5b90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5ba0: 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61  CE,.** an OP_Tra
5bb0: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ce instruction i
5bc0: 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65  s always inserte
5bd0: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
5be0: 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73  Get() as soon as
5bf0: 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69  .** a new VDBE i
5c00: 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77  s created.  So w
5c10: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65  e are free to se
5c20: 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70  t addr to p->nOp
5c30: 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  -1 without.** ha
5c40: 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63  ving to double-c
5c50: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5c60: 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  e that the resul
5c70: 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
5c80: 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c  e. But.** if SQL
5c90: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69  ITE_OMIT_TRACE i
5ca0: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f  s defined, the O
5cb0: 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74  P_Trace is omitt
5cc0: 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65  ed and we do nee
5cd0: 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68  d to.** check th
5ce0: 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f  e value of p->nO
5cf0: 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  p-1 before conti
5d00: 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70  nuing..*/.VdbeOp
5d10: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
5d20: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
5d30: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
5d40: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
5d50: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
5d60: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
5d70: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
5d80: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
5d90: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
5da0: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
5db0: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
5dc0: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
5dd0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 64  c const VdbeOp d
5de0: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
5df0: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
5e00: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
5e10: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
5e20: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
5e30: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
5e40: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
5e50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
5e60: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
5e70: 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65  ( p->nOp==0 ) re
5e80: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
5e90: 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ummy;.#endif.   
5ea0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
5eb0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
5ec0: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
5ed0: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
5ee0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5ef0: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
5f00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5f10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
5f20: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
5f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
5f40: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
5f50: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
5f60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5f70: 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65  _EXPLAIN) || !de
5f80: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a  fined(NDEBUG) \.
5f90: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
5fa0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
5fb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5fc0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d  DEBUG)./*.** Com
5fd0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
5fe0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
5ff0: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
6000: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
6010: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
6020: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
6030: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
6040: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
6050: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
6060: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
6070: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
6080: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
6090: 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  mp;.  assert( nT
60a0: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69  emp>=20 );.  swi
60b0: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
60c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
60d0: 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a  KEYINFO_STATIC:.
60e0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
60f0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
6100: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
6110: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
6120: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
6130: 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
6140: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6150: 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f   zTemp, "keyinfo
6160: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
6170: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69  nField);.      i
6180: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6190: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  30(zTemp);.     
61a0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
61b0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
61c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
61d0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
61e0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
61f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
6200: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
6210: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
6220: 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a  trlen30(pColl->z
6230: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
6240: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36   if( i+n>nTemp-6
6250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6260: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
6270: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
6280: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6290: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
62a0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
62b0: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20  = ',';.         
62c0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
62d0: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65  SortOrder && pKe
62e0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
62f0: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
6300: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
6310: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '-';.          
6320: 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
6330: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43  py(&zTemp[i], pC
6340: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b  oll->zName,n+1);
6350: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
6360: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
6370: 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36   if( i+4<nTemp-6
6380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
6390: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
63a0: 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,nil",4);.      
63b0: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
63c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
63d0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
63e0: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
63f0: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
6400: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
6410: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6420: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6430: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
6440: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6450: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
6460: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
6470: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6480: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
6490: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
64a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
64b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
64c0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
64d0: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
64e0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
64f0: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
6500: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6510: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
6520: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
6530: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
6540: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6550: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6560: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
6570: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6580: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6590: 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  lld", *pOp->p4.p
65a0: 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  I64);.      brea
65b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
65c0: 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
65d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
65e0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
65f0: 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34  p, "%d", pOp->p4
6600: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
6610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6620: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
6630: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6640: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6650: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
6660: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
6670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6680: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
6690: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
66a0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
66b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
66c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
66d0: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20  M_Null)==0 );.  
66e0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
66f0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
6700: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
6710: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
6720: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
6730: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
6740: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6750: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6760: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
6770: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
6780: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
6790: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
67a0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
67b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
67c0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
67d0: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
67e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
67f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
6800: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
6810: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
6820: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
6830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6840: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
6850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6860: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
6870: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
6890: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
68a0: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
68b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
68c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
68d0: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
68e0: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
68f0: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
6900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
6910: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
6920: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
6930: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6940: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6950: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
6960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6970: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
6980: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
6990: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
69a0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
69b0: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
69c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69d0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
69e0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
69f0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
6a00: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
6a10: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
6a20: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
6a30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6a40: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6a50: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
6a60: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
6a70: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
6a80: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
6a90: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
6aa0: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
6ab0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ] is used..**.**
6ac0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
6ad0: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f  atements need to
6ae0: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
6af0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   the complete se
6b00: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  t of.** attached
6b10: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
6b20: 74 68 65 79 20 77 69 6c 6c 20 62 65 20 75 73 69  they will be usi
6b30: 6e 67 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  ng.  A mask of t
6b40: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
6b50: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
6b60: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  in p->btreeMask 
6b70: 61 6e 64 20 69 73 20 75 73 65 64 20 66 6f 72 20  and is used for 
6b80: 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6f 74 68 65  locking and othe
6b90: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
6ba0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
6bb0: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
6bc0: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
6bd0: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
6be0: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69  >db->nDb && i<(i
6bf0: 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73  nt)sizeof(yDbMas
6c00: 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74  k)*8 );.  assert
6c10: 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( i<(int)sizeof(
6c20: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
6c30: 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  );.  p->btreeMas
6c40: 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31  k |= ((yDbMask)1
6c50: 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31  )<<i;.  if( i!=1
6c60: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
6c70: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
6c80: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
6c90: 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c     p->lockMask |
6ca0: 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c  = ((yDbMask)1)<<
6cb0: 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  i;.  }.}..#if !d
6cc0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6cd0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
6ce0: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
6cf0: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  DSAFE>0./*.** If
6d00: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
6d10: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
6d20: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
6d30: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
6d40: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
6d50: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
6d60: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
6d70: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
6d80: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
6d90: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
6da0: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
6db0: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
6dc0: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
6dd0: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
6de0: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
6df0: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
6e00: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
6e10: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
6e20: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
6e30: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
6e40: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
6e50: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
6e60: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
6e70: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
6e80: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
6e90: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
6ea0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
6eb0: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
6ec0: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
6ed0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
6ee0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
6ef0: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
6f00: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
6f10: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
6f20: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
6f30: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
6f40: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
6f50: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
6f60: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
6f70: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
6f80: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
6f90: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6fa0: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
6fb0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6fc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
6fd0: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
6fe0: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
6ff0: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
7000: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
7010: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
7020: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
7030: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
7040: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
7050: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
7060: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
7070: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
7080: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
7090: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
70a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
70b0: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
70c0: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
70d0: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
70e0: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
70f0: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
7100: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
7110: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7120: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
7130: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
7140: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
7150: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70  int nDb;.  if( p
7160: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20  ->lockMask==0 ) 
7170: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
7180: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
7190: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
71a0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
71b0: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
71c0: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
71d0: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61  ; i<nDb; i++, ma
71e0: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20  sk += mask){.   
71f0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61   if( i!=1 && (ma
7200: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  sk & p->lockMask
7210: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61  )!=0 && ALWAYS(a
7220: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
7230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7240: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
7250: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
7260: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
7270: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7280: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
7290: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
72a0: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
72b0: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
72c0: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
72d0: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
72e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
72f0: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69  eEnter()..*/.voi
7300: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
7310: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
7320: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
7330: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7340: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
7350: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
7360: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
7370: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
7380: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
7390: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
73a0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
73b0: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
73c0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
73d0: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
73e0: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
73f0: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
7400: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
7410: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
7420: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
7430: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7440: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
7450: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
7460: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
7470: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
7480: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
7490: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
74a0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
74b0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
74c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
74d0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
74e0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
74f0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
7500: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
7510: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
7520: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
7530: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
7540: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7550: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
7560: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
7570: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
7580: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
7590: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
75a0: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
75b0: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
75c0: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
75d0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
75e0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
75f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
7600: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
7610: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
7620: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
7630: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
7640: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7650: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
7660: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
7670: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
7680: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
7690: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
76a0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
76b0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
76c0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
76d0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
76e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
76f0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
7700: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
7710: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
7720: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
7730: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
7740: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
7750: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
7760: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
7770: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7780: 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  d ){.      for(p
7790: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
77a0: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
77b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
77c0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
77d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
77e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
77f0: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
7800: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
7810: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
7820: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
7830: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
7840: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
7850: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
7860: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
7870: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
7880: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
7890: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
78a0: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
78b0: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
78c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
78d0: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
78e0: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
78f0: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
7900: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
7910: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
7920: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
7930: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
7940: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
7950: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
7960: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
7970: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
7980: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
7990: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
79a0: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
79b0: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
79c0: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
79d0: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
79e0: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
79f0: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
7a00: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
7a10: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
7a20: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
7a30: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
7a40: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
7a50: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
7a60: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
7a70: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
7a80: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
7a90: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
7aa0: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
7ab0: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
7ac0: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
7ad0: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
7ae0: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
7af0: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
7b00: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
7b10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7b20: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
7b30: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
7b40: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
7b50: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
7b60: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7b70: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
7b80: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c  else if( p->zMal
7b90: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
7ba0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7bb0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
7bc0: 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63        p->zMalloc
7bd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
7be0: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
7bf0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  MEM_Null;.    }.
7c00: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
7c10: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
7c20: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
7c30: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
7c40: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
7c50: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
7c60: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
7c70: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
7c80: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
7c90: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
7ca0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
7cb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7cc0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
7cd0: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
7ce0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
7cf0: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
7d00: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
7d10: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
7d20: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
7d30: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
7d40: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7d50: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
7d60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
7d70: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
7d80: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
7d90: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
7da0: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
7db0: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
7dc0: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
7dd0: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
7de0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
7df0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
7e00: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
7e10: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
7e20: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
7e30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
7e40: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
7e50: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
7e60: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
7e70: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
7e80: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
7e90: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
7ea0: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
7eb0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
7ec0: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
7ed0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
7ee0: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
7ef0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
7f00: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
7f10: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
7f20: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
7f30: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
7f40: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
7f50: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
7f60: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
7f70: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
7f80: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
7f90: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
7fa0: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
7fb0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
7fc0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
7fd0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
7fe0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
7ff0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
8000: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
8010: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
8020: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
8030: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
8040: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
8050: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
8060: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8080: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
8090: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
80c0: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
80d0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
80e0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8110: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
8120: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
8130: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
8140: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8150: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
8160: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
8170: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
81a0: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
81b0: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
81c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
81d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
81e0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
81f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
8200: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8230: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8270: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
8280: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
8290: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f   &p->aMem[1];  /
82a0: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
82b0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
82c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
82d0: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
82e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
82f0: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
8300: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
8310: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
8320: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
8330: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8340: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
8350: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
8360: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
8370: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
8380: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
8390: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
83a0: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
83b0: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
83c0: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
83d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
83e0: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
83f0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
8400: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
8410: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
8420: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
8430: 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  8);..  if( p->rc
8440: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
8450: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
8460: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
8470: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
8480: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
8490: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
84a0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
84b0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
84c0: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
84d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
84e0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
84f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
8500: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
8510: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
8520: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
8530: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
8540: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
8550: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
8560: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
8570: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
8580: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
8590: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
85a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
85b0: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
85c0: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
85d0: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
85e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
85f0: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
8600: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
8610: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
8620: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
8630: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
8640: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
8650: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
8660: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
8670: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
8680: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
8690: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
86a0: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
86b0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
86c0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
86d0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
86e0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
86f0: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
8700: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
8710: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
8720: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
8730: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
8740: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
8750: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
8760: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
8770: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
8780: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
8790: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
87a0: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
87b0: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
87c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
87d0: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
87e0: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
87f0: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
8800: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
8810: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
8820: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
8830: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
8840: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
8850: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
8860: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
8870: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
8880: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
8890: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
88a0: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
88b0: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
88c0: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
88d0: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
88e0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
88f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
8900: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
8910: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
8920: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
8930: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
8940: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
8950: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
8960: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
8970: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
8980: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
8990: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
89a0: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
89b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
89c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
89d0: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
89e0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
89f0: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
8a00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
8a10: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
8a20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8a30: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
8a40: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
8a50: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
8a60: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
8a70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
8a80: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
8a90: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
8aa0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
8ab0: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
8ac0: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
8ad0: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
8ae0: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
8af0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
8b00: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
8b10: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
8b20: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
8b30: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
8b40: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
8b50: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
8b60: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
8b70: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
8b80: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
8b90: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
8ba0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
8bb0: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
8bc0: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
8bd0: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
8be0: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
8bf0: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
8c00: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
8c10: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
8c20: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
8c30: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
8c40: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
8c50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8c60: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
8c70: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8c80: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
8c90: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
8cd0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
8ce0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
8cf0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
8d00: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
8d10: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
8d20: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
8d30: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8d40: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20  (pOp->opcode);  
8d50: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
8d60: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
8d70: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
8d80: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
8d90: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
8da0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
8db0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
8dc0: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
8dd0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
8de0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
8df0: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
8e00: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
8e10: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
8e20: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
8e30: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
8e40: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
8e50: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
8e60: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
8e70: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
8e80: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
8e90: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
8ea0: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
8eb0: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
8ec0: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
8ed0: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
8ee0: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
8ef0: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
8f00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
8f10: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
8f20: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
8f30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
8f40: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
8f50: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
8f60: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
8f70: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
8f80: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
8f90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
8fa0: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
8fb0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
8fc0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
8fd0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
8fe0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
8ff0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
9000: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31  w(pSub, nByte, 1
9010: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
9020: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
9030: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
9040: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
9050: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
9060: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
9070: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
9080: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
9090: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
90a0: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
90b0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
90c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
90d0: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
90e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
90f0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
9100: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
9130: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9140: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
9150: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
9160: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
9170: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
9180: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
91b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
91c0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
91d0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
91e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
91f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
9200: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
9230: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
9240: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
9250: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
9260: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9270: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
9280: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
9290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
92a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
92b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
92c0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
92d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
92e0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
92f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
9300: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9310: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
9320: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
9330: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
9340: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
9350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
9360: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
9370: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
9380: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
9390: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
93a0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
93b0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
93c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
93d0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
93e0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
93f0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
9400: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9410: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
9420: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
9430: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
9440: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9450: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
9460: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
9470: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
9480: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9490: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
94a0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
94b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
94c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
94d0: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
94e0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
94f0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
9500: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9510: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
9520: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
9530: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
9540: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9550: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
9560: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
9570: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
9580: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
9590: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
95a0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d     if( pOp->zCom
95b0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
95c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
95d0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
95e0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
95f0: 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b  = pOp->zComment;
9600: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
9610: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9620: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
9630: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
9640: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
9650: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
9660: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
9670: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
9680: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
9690: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
96a0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
96d0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
96e0: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
96f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9700: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
9710: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
9720: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
9730: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
9740: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9750: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
9760: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
9770: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
9780: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
9790: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
97a0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
97b0: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
97c0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
97d0: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
97e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
97f0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
9800: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
9810: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
9820: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
9830: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
9840: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
9850: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
9860: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
9870: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
9880: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9890: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
98a0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
98b0: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
98c0: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
98d0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
98e0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
98f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9900: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
9910: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9920: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
9930: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
9940: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
9950: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
9960: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9970: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
9980: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
9990: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
99a0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
99b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
99c0: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
99d0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
99e0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
99f0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
9a00: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
9a10: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
9a20: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
9a30: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
9a40: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
9a50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9a60: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
9a70: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
9a80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
9a90: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9aa0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
9ab0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
9ac0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9ad0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9ae0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
9af0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
9b00: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
9b10: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
9b20: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9b30: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
9b40: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
9b50: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
9b60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
9b70: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
9b80: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9b90: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9ba0: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
9bb0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
9bc0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
9bd0: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
9be0: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
9bf0: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
9c00: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
9c10: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
9c20: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9c30: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
9c40: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
9c50: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
9c60: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
9c70: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
9c80: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
9c90: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
9ca0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
9cb0: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
9cc0: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
9cd0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
9ce0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
9cf0: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
9d00: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
9d10: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
9d20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
9d30: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
9d40: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
9d50: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
9d60: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
9d70: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
9d80: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
9d90: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
9da0: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
9db0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
9dc0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
9dd0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
9de0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   needed..**.** *
9df0: 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f  ppFrom points to
9e00: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
9e10: 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73   and pEnd points
9e20: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
9e30: 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  he.** available 
9e40: 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61  space.  When spa
9e50: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ce is allocated,
9e60: 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61   *ppFrom is adva
9e70: 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65  nced past.** the
9e80: 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f   end of the allo
9e90: 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a  cated space..**.
9ea0: 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20  ** *pnByte is a 
9eb0: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
9ec0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9ed0: 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76  f space that hav
9ee0: 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61  e failed.** to a
9ef0: 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65  llocate.  If the
9f00: 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  re is insufficie
9f10: 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46  nt space in *ppF
9f20: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
9f30: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
9f40: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
9f50: 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f  nByte by the amo
9f60: 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65  unt of the reque
9f70: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
9f80: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
9f90: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
9fa0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
9fb0: 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77  return pointer w
9fc0: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f  ill be stored */
9fd0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
9fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9ff0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c  r of bytes to al
a000: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a  locate */.  u8 *
a010: 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  *ppFrom,        
a020: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f   /* IN/OUT: Allo
a030: 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f  cate from *ppFro
a040: 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c  m */.  u8 *pEnd,
a050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a060: 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65  ointer to 1 byte
a070: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a080: 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20   *ppFrom buffer 
a090: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65  */.  int *pnByte
a0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
a0b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
a0c0: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
a0d0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
a0e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
a0f0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
a100: 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20  T(*ppFrom) );.  
a110: 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72  if( pBuf ) retur
a120: 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20  n pBuf;.  nByte 
a130: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
a140: 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d  .  if( &(*ppFrom
a150: 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64  )[nByte] <= pEnd
a160: 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28   ){.    pBuf = (
a170: 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20  void*)*ppFrom;. 
a180: 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42     *ppFrom += nB
a190: 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  yte;.  }else{.  
a1a0: 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79    *pnByte += nBy
a1b0: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
a1c0: 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pBuf;.}../*.** 
a1d0: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
a1e0: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
a1f0: 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ecution.  This i
a200: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
a210: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
a220: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
a230: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
a240: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
a250: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
a260: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
a270: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
a280: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
a290: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
a2a0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
a2b0: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
a2c0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  * This is the on
a2d0: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61  ly way to move a
a2e0: 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f   VDBE from VDBE_
a2f0: 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a  MAGIC_INIT to.**
a300: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e   VDBE_MAGIC_RUN.
a310: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
a320: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
a330: 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
a340: 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69  e on a single vi
a350: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
a360: 2a 20 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * The first call
a370: 20 69 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63   is made while c
a380: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c  ompiling the SQL
a390: 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73   statement. Subs
a3a0: 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20  equent.** calls 
a3b0: 61 72 65 20 6d 61 64 65 20 61 73 20 70 61 72 74  are made as part
a3c0: 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   of the process 
a3d0: 6f 66 20 72 65 73 65 74 74 69 6e 67 20 61 20 73  of resetting a s
a3e0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a  tatement to be.*
a3f0: 2a 20 72 65 2d 65 78 65 63 75 74 65 64 20 28 66  * re-executed (f
a400: 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  rom a call to sq
a410: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20  lite3_reset()). 
a420: 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20  The nVar, nMem, 
a430: 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20  nCursor .** and 
a440: 69 73 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65  isExplain parame
a450: 74 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61  ters are only pa
a460: 73 73 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c  ssed correct val
a470: 75 65 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ues the first ti
a480: 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69  me.** the functi
a490: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e  on is called. On
a4a0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
a4b0: 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  s, from sqlite3_
a4c0: 72 65 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a  reset(), nVar.**
a4d0: 20 69 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e   is passed -1 an
a4e0: 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20  d nMem, nCursor 
a4f0: 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72  and isExplain ar
a500: 65 20 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72  e all passed zer
a510: 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
a520: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
a530: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
a560: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
a590: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
a5a0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
a5b0: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
a5e0: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
a5f0: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
a600: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
a610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a620: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
a630: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
a640: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a660: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
a670: 20 6f 66 20 61 72 67 73 20 69 6e 20 53 75 62 50   of args in SubP
a680: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
a690: 20 69 73 45 78 70 6c 61 69 6e 2c 20 20 20 20 20   isExplain,     
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a6b0: 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41  rue if the EXPLA
a6c0: 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70  IN keywords is p
a6d0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
a6e0: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a700: 75 65 20 74 6f 20 73 65 74 20 56 64 62 65 2e 75  ue to set Vdbe.u
a710: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a  sesStmtJournal *
a720: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
a730: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
a740: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
a750: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
a760: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
a770: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
a780: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
a790: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
a7a0: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
a7b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
a7c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
a7d0: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
a7e0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
a7f0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
a800: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
a810: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
a820: 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  RUN;..  /* For e
a830: 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69  ach cursor requi
a840: 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  red, also alloca
a850: 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  te a memory cell
a860: 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65  . Memory.  ** ce
a870: 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72  lls (nMem+1-nCur
a880: 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c  sor)..nMem, incl
a890: 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65  usive, will neve
a8a0: 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  r be used by.  *
a8b0: 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  * the vdbe progr
a8c0: 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79  am. Instead they
a8d0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c   are used to all
a8e0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a  ocate space for.
a8f0: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f    ** VdbeCursor/
a900: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
a910: 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66  res. The blob of
a920: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
a930: 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75  ed with .  ** cu
a940: 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64  rsor 0 is stored
a950: 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
a960: 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c  nMem. Memory cel
a970: 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20  l (nMem-1).  ** 
a980: 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20  stores the blob 
a990: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
a9a0: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
a9b0: 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20   1, etc..  **.  
a9c0: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
a9d0: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
a9e0: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
a9f0: 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ursor;..  /* All
aa00: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
aa10: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
aa20: 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c  , SQL variables,
aa30: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e   VDBE cursors an
aa40: 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79  d .  ** an array
aa50: 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20   to marshal SQL 
aa60: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
aa70: 74 73 20 69 6e 2e 20 54 68 69 73 20 69 73 20 6f  ts in. This is o
aa80: 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a  nly done the.  *
aa90: 2a 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  * first time thi
aaa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
aab0: 6c 6c 65 64 20 66 6f 72 20 61 20 67 69 76 65 6e  lled for a given
aac0: 20 56 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20   VDBE, not when 
aad0: 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  it is.  ** being
aae0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c   called from sql
aaf0: 69 74 65 33 5f 72 65 73 65 74 28 29 20 74 6f 20  ite3_reset() to 
ab00: 72 65 73 65 74 20 74 68 65 20 76 69 72 74 75 61  reset the virtua
ab10: 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a  l machine..  */.
ab20: 20 20 69 66 28 20 6e 56 61 72 3e 3d 30 20 26 26    if( nVar>=0 &&
ab30: 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c   ALWAYS(db->mall
ab40: 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a  ocFailed==0) ){.
ab50: 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28      u8 *zCsr = (
ab60: 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e  u8 *)&p->aOp[p->
ab70: 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d  nOp];       /* M
ab80: 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20  emory avaliable 
ab90: 66 6f 72 20 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f  for alloation */
aba0: 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20  .    u8 *zEnd = 
abb0: 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d  (u8 *)&p->aOp[p-
abc0: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
abd0: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
abe0: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f  available mem */
abf0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac20: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
ac30: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
ac40: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
ac50: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
ac60: 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a      p->usesStmtJ
ac70: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
ac80: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20  sStmtJournal;.  
ac90: 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20    if( isExplain 
aca0: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
acb0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
acc0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
acd0: 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43  zCsr, 0, zEnd-zC
ace0: 73 72 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d  sr);.    zCsr +=
acf0: 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29   (zCsr - (u8*)0)
ad00: 26 37 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  &7;.    assert( 
ad10: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
ad20: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20  MENT(zCsr) );.. 
ad30: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72     /* Memory for
ad40: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
ad50: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
ad60: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
ad70: 64 20 69 6e 20 74 77 6f 0a 20 20 20 20 2a 2a 20  d in two.    ** 
ad80: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
ad90: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
ada0: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
adb0: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
adc0: 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
add0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
ade0: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
adf0: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
ae00: 6c 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  l memory.    ** 
ae10: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
ae20: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
ae30: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
ae40: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
ae50: 20 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20     ** pass will 
ae60: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
ae70: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
ae80: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 20  llocation.  .   
ae90: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
aea0: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
aeb0: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
aec0: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
aed0: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
aee0: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
aef0: 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  r space at the e
af00: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
af10: 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69   array can signi
af20: 66 69 63 61 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  ficantly.    ** 
af30: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
af40: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
af50: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
af60: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
af70: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
af80: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  nByte = 0;.     
af90: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
afa0: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
afb0: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
afc0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
afd0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Byte);.      p->
afe0: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
aff0: 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  e(p->aVar, nVar*
b000: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
b010: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b020: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  );.      p->apAr
b030: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
b040: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
b050: 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73  zeof(Mem*), &zCs
b060: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b070: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
b080: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b090: 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  >azVar, nVar*siz
b0a0: 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73  eof(char*), &zCs
b0b0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b0c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
b0d0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b0e0: 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
b0f0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
b100: 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r*),.           
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b130: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
b140: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
b150: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
b160: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
b170: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
b180: 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20     }.      zCsr 
b190: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
b1a0: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
b1b0: 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Byte];.    }whil
b1c0: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
b1d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b1e0: 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ..    p->nCursor
b1f0: 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b   = (u16)nCursor;
b200: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 56 61 72  .    if( p->aVar
b210: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61   ){.      p->nVa
b220: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
b230: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  .      for(n=0; 
b240: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
b250: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b260: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
b270: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  l;.        p->aV
b280: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
b290: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b2a0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
b2b0: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b        p->aMem--;
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
b2e0: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
b2f0: 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  m */.      p->nM
b300: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
b310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
b320: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
b330: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20  nMem-1 */.      
b340: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
b350: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
b360: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
b370: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
b380: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
b390: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
b3a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
b3b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
b3c0: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e   for(n=1; n<p->n
b3d0: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61  Mem; n++){.    a
b3e0: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e  ssert( p->aMem[n
b3f0: 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a  ].db==db );.  }.
b400: 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20  #endif..  p->pc 
b410: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
b420: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
b430: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
b440: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70  _Abort;.  p->exp
b450: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
b460: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
b470: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
b480: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
b490: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
b4a0: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
b4b0: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
b4c0: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
b4d0: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
b4e0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
b4f0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
b500: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74  FILE.  {.    int
b510: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
b520: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
b530: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
b540: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  .cnt = 0;.      
b550: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
b560: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
b570: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
b580: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
b590: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
b5a0: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
b5b0: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
b5c0: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
b5d0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
b5e0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
b5f0: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
b600: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
b610: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
b620: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b630: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
b640: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
b650: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
b660: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
b670: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
b680: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
b690: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
b6a0: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
b6b0: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
b6c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
b6d0: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
b6e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
b6f0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
b700: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
b710: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b720: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
b730: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
b740: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b750: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
b760: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
b770: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
b780: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
b790: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
b7a0: 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  = pCx->pModule;.
b7b0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
b7c0: 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f  hod = 1;.    pMo
b7d0: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
b7e0: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  abCursor);.    p
b7f0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
b800: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
b810: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
b820: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
b830: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
b840: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
b850: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
b860: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
b870: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
b880: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
b890: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
b8a0: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
b8b0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
b8c0: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
b8d0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
b8e0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
b8f0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
b900: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
b910: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
b920: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
b930: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
b940: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
b950: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
b960: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
b970: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
b980: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
b990: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
b9a0: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
b9b0: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
b9c0: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
b9d0: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
b9e0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
b9f0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
ba00: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
ba10: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
ba20: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
ba30: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
ba40: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
ba50: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
ba60: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
ba70: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
ba80: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
ba90: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
baa0: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
bab0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
bac0: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
bad0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
bae0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
baf0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
bb00: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
bb10: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
bb20: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
bb30: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
bb40: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
bb50: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
bb60: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
bb70: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
bb80: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
bb90: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
bba0: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
bbb0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
bbc0: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
bbd0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
bbe0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
bbf0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
bc00: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
bc10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
bc20: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
bc30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
bc40: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
bc50: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
bc60: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
bc70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
bc80: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
bc90: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
bca0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
bcb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
bcc0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
bcd0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
bce0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
bcf0: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
bd00: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
bd10: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
bd20: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
bd30: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
bd40: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
bd50: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
bd60: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
bd70: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
bd80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
bd90: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
bda0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
bdb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
bdc0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
bdd0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
bde0: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
bdf0: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
be00: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
be10: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
be20: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
be30: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
be40: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
be50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
be60: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
be70: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
be80: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
be90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
bea0: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
beb0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
bec0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
bed0: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
bee0: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
bef0: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
bf00: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
bf10: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
bf20: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
bf30: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
bf40: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
bf50: 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e  >apCsr==0 || p->
bf60: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
bf70: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
bf80: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
bf90: 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c  t( p->aMem==0 ||
bfa0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
bfb0: 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23  s==MEM_Null );.#
bfc0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
bfd0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
bfe0: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
bff0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
c000: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
c010: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c020: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
c030: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
c040: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
c050: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
c060: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
c070: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
c080: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
c090: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
c0a0: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
c0b0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
c0c0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
c0d0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
c0e0: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
c0f0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
c100: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
c110: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
c120: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
c130: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
c140: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
c150: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
c160: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
c170: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c180: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
c190: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
c1a0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
c1b0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
c1c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c1d0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
c1e0: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
c1f0: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
c200: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
c210: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
c220: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
c230: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
c240: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c250: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
c260: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
c270: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
c280: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
c290: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
c2a0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
c2b0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
c2c0: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
c2d0: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
c2e0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
c2f0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
c300: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
c310: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
c320: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
c330: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
c340: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
c350: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
c360: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
c370: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
c380: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
c390: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
c3a0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c3b0: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
c3c0: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
c3d0: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
c3e0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
c3f0: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
c400: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
c410: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
c420: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
c430: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
c440: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
c450: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
c460: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
c470: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
c480: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
c490: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
c4a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
c4b0: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
c4e0: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
c4f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c520: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
c530: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
c540: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c570: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
c580: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
c590: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
c5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
c5b0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
c5c0: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
c5d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
c5e0: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
c5f0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
c600: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
c610: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
c620: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
c630: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
c640: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
c650: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
c660: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
c670: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
c680: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c690: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
c6a0: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
c6b0: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
c6c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c6d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
c6e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
c6f0: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
c700: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
c710: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
c720: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
c730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
c740: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
c750: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
c760: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
c770: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
c780: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
c790: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
c7a0: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
c7b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
c7d0: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
c7e0: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
c7f0: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
c800: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
c810: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
c820: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
c830: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
c840: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
c850: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
c860: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
c870: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
c880: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
c890: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
c8a0: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
c8b0: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
c8c0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
c8d0: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
c8e0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
c8f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
c900: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
c910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
c920: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
c930: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
c940: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
c950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c960: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
c970: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
c980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
c990: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
c9a0: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
c9b0: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
c9c0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
c9d0: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
c9e0: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
c9f0: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
ca00: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ca10: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
ca20: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
ca30: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
ca40: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
ca50: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
ca60: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
ca70: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
ca80: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
ca90: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
caa0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
cab0: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
cac0: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
cad0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cae0: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
caf0: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
cb00: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
cb10: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
cb20: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
cb30: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
cb40: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
cb50: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
cb60: 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  (db, &p->zErrMsg
cb70: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
cb80: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
cb90: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
cba0: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
cbb0: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
cbc0: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
cbd0: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
cbe0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
cbf0: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
cc00: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
cc10: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
cc20: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
cc30: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
cc40: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
cc50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
cc60: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
cc70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
cc80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
cc90: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
cca0: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
ccb0: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
ccc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
ccd0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
cce0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ccf0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
cd00: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
cd10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
cd20: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
cd30: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
cd40: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
cd50: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
cd60: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63  rans++;.      rc
cd70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
cd80: 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c  xclusiveLock(sql
cd90: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
cda0: 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Bt));.    }.  }.
cdb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cdc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
cdd0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
cde0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
cdf0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
ce00: 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
ce10: 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
ce20: 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
ce30: 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
ce40: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
ce50: 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
ce60: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
ce70: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
ce80: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ce90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cea0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
ceb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
cec0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
ced0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
cee0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
cef0: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
cf00: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
cf10: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
cf20: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
cf30: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
cf40: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
cf50: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
cf60: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
cf70: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
cf80: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
cf90: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
cfa0: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
cfb0: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
cfc0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
cfd0: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
cfe0: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
cff0: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
d000: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
d010: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
d020: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
d030: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
d040: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
d050: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
d060: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
d070: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
d080: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
d090: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
d0a0: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
d0b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
d0c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d0d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
d0e0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
d0f0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d100: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
d110: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
d120: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d130: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
d140: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
d150: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
d160: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
d170: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
d180: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
d190: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
d1a0: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
d1b0: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
d1c0: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
d1d0: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
d1e0: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
d1f0: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
d200: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
d210: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
d220: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
d230: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
d240: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
d250: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
d260: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
d270: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
d280: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
d290: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d2a0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d2b0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d2c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d2d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d2e0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
d2f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d300: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d310: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
d320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d330: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d340: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
d350: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
d360: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
d370: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
d380: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
d390: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
d3a0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d3b0: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
d3c0: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
d3d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d3e0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
d3f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
d400: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
d410: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
d420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d430: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
d440: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
d450: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
d460: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
d470: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
d480: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
d490: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
d4a0: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
d4b0: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
d4c0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
d4d0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
d4e0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
d4f0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
d500: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
d510: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
d520: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d530: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20      int res;..  
d540: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
d550: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d560: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f  e name */.    do
d570: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
d580: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  ndom;.      sqli
d590: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
d5a0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
d5b0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
d5c0: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
d5d0: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
d5e0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
d5f0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d600: 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61  "%s-mj%08X", zMa
d610: 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26  inFile, iRandom&
d620: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0x7fffffff);.   
d630: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
d640: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d650: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
d670: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
d680: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
d690: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
d6a0: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
d6b0: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
d6c0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
d6d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
d6e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d6f0: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
d700: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
d710: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d720: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
d730: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
d740: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
d750: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
d760: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
d770: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
d780: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
d790: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
d7a0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
d7b0: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
d7c0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
d7d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d7e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d7f0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
d800: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
d810: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
d820: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
d830: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
d840: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
d850: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
d860: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
d870: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
d880: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
d890: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
d8a0: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
d8b0: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
d8c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d8d0: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
d8e0: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
d8f0: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
d900: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
d910: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
d920: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
d930: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
d940: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
d950: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
d960: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
d970: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
d980: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
d990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
d9a0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d9b0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
d9c0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
d9d0: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
d9e0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
d9f0: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
da00: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
da10: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
da20: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
da30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
da40: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
da50: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
da60: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
da70: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
da80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
da90: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
daa0: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
dab0: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
dac0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
dad0: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
dae0: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
daf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
db00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
db10: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
db20: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
db30: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
db40: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
db50: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
db60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
db70: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
db80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
db90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dba0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
dbb0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
dbc0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
dbd0: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
dbe0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
dbf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
dc00: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
dc10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
dc20: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
dc30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
dc40: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
dc50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
dc60: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
dc70: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
dc80: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
dc90: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
dca0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
dcb0: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
dcc0: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
dcd0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
dce0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
dcf0: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
dd00: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
dd10: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
dd20: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
dd30: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
dd40: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
dd50: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
dd60: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
dd70: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
dd80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
dd90: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
dda0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
ddb0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
ddc0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
ddd0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
dde0: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
ddf0: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
de00: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
de10: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
de20: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
de30: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
de40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
de50: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
de60: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
de70: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
de80: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
de90: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
dea0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
deb0: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
dec0: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
ded0: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
dee0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
def0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
df00: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
df10: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
df20: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
df30: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
df40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
df50: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
df60: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
df70: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
df80: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
df90: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
dfa0: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
dfb0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
dfc0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
dfd0: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
dfe0: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
dff0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
e000: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e010: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e020: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
e030: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e040: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
e050: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
e060: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e070: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
e080: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
e090: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
e0a0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
e0b0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
e0c0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e0d0: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
e0e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e0f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e100: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e110: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
e120: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
e130: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
e140: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e150: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
e160: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
e170: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
e180: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
e190: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
e1a0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
e1b0: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
e1c0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
e1d0: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
e1e0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
e1f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
e200: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
e210: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
e220: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
e230: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
e240: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
e250: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
e260: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
e270: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
e280: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
e290: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e2a0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
e2b0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
e2c0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
e2d0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e2e0: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
e2f0: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
e300: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
e310: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
e320: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
e330: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
e340: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
e350: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
e360: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
e370: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
e380: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
e390: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
e3a0: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
e3b0: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
e3c0: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
e3d0: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
e3e0: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
e3f0: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
e400: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
e410: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
e420: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
e430: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
e440: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
e450: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
e460: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
e470: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
e480: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
e490: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e4a0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e4b0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
e4c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e4d0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
e4e0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
e4f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e500: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
e510: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
e520: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
e530: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
e540: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
e550: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
e560: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
e570: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e580: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
e590: 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56   sqlite3.activeV
e5a0: 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72  dbeCnt count var
e5b0: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
e5c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
e5d0: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
e5e0: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
e5f0: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
e600: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
e610: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
e620: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
e630: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
e640: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
e650: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
e660: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
e670: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
e680: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
e690: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
e6a0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
e6b0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
e6c0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
e6d0: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
e6e0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
e6f0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
e700: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
e710: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
e720: 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20  nWrite = 0;.  p 
e730: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
e740: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
e750: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
e760: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
e770: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
e780: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
e790: 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
e7a0: 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
e7b0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
e7c0: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
e7d0: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
e7e0: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61  veVdbeCnt );.  a
e7f0: 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
e800: 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20  b->writeVdbeCnt 
e810: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
e820: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
e830: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
e840: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ./*.** For every
e850: 20 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64   Btree that in d
e860: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e870: 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20  on db which .** 
e880: 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
e890: 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76  d, "trip" or inv
e8a0: 61 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72  alidate each cur
e8b0: 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42  sor in.** that B
e8c0: 74 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20  tree might have 
e8d0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
e8e0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
e8f0: 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65  .** can never be
e900: 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68   used again.  Th
e910: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
e920: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f  a rollback.*** o
e930: 63 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20  ccurs.  We have 
e940: 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20  to trip all the 
e950: 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65  other cursors, e
e960: 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72  ven.** cursor fr
e970: 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20  om other VMs in 
e980: 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61  different databa
e990: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a  se connections,.
e9a0: 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20  ** so that none 
e9b0: 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75  of them try to u
e9c0: 73 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77  se the data at w
e9d0: 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72  hich they.** wer
e9e0: 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77  e pointing and w
e9f0: 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76  hich now may hav
ea00: 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64  e been changed d
ea10: 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c  ue.** to the rol
ea20: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d  lback..**.** Rem
ea30: 65 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c  ember that a rol
ea40: 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65  lback can delete
ea50: 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65   tables complete
ea60: 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20   and.** reorder 
ea70: 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69  rootpages.  So i
ea80: 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
ea90: 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65  ent just to save
eaa0: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66  .** the state of
eab0: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65   the cursor.  We
eac0: 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64   have to invalid
ead0: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ate the cursor.*
eae0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  * so that it is 
eaf0: 6e 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e  never used again
eb00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
eb10: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
eb20: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
eb30: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
eb40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
eb50: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
eb60: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
eb70: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
eb80: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26  pBt;.    if( p &
eb90: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
eba0: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
ebb0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ebc0: 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
ebd0: 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b  , SQLITE_ABORT);
ebe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
ebf0: 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
ec00: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
ec10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
ec20: 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
ec30: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
ec40: 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
ec50: 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
ec60: 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
ec70: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
ec80: 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
ec90: 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
eca0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
ecb0: 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
ecc0: 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
ecd0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
ece0: 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
ecf0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
ed00: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
ed10: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
ed20: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64  tion is commtted
ed30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
ed40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
ed50: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
ed60: 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
ed70: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
ed80: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
ed90: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
eda0: 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
edb0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
edc0: 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
edd0: 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
ede0: 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
edf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
ee00: 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
ee10: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
ee20: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
ee30: 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
ee40: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
ee50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
ee60: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
ee70: 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
ee80: 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
ee90: 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
eea0: 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
eeb0: 75 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e  ured, causing an
eec0: 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
eed0: 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69  ack..  ** In thi
eee0: 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61  s case (db->nSta
eef0: 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20  tement==0), and 
ef00: 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
ef10: 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69   to do..  */.  i
ef20: 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  f( db->nStatemen
ef30: 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
ef40: 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  nt ){.    int i;
ef50: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
ef60: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69  Savepoint = p->i
ef70: 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20  Statement-1;..  
ef80: 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
ef90: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
efa0: 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
efb0: 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
efc0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
efd0: 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
efe0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
eff0: 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
f000: 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
f010: 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20  vepoint) );..   
f020: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
f030: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
f040: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
f050: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72  TE_OK;.      Btr
f060: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
f070: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
f080: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
f090: 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
f0a0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
f0b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
f0c0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
f0d0: 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
f0e0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
f0f0: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
f100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f110: 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
f120: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f130: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
f140: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
f150: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f160: 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
f170: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f180: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f190: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f1a0: 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
f1b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f1c0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61    }.    db->nSta
f1d0: 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d  tement--;.    p-
f1e0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
f1f0: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
f200: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f210: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f220: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f230: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f240: 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
f250: 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
f260: 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
f270: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
f280: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f290: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f2a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
f2b0: 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
f2c0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f2d0: 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
f2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f2f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
f300: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f310: 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
f320: 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
f330: 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
f340: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
f350: 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
f360: 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
f370: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
f380: 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
f390: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
f3a0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
f3b0: 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
f3c0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
f3d0: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
f3e0: 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
f3f0: 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
f400: 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  efCons;.    }.  
f410: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f430: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
f440: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
f450: 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
f460: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
f470: 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
f480: 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
f490: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
f4a0: 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
f4b0: 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
f4c0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
f4d0: 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
f4e0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
f4f0: 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
f500: 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
f510: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
f520: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
f530: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
f540: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
f550: 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
f560: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
f570: 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
f580: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
f590: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
f5a0: 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
f5b0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72  ONSTRAINT and wr
f5c0: 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ite.** an error 
f5d0: 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
f5e0: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
f5f0: 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
f600: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f610: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
f620: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
f630: 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
f640: 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
f650: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
f660: 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
f670: 64 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72  d && db->nDeferr
f680: 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64  edCons>0) || (!d
f690: 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
f6a0: 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29  kConstraint>0) )
f6b0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
f6c0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
f6d0: 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
f6e0: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
f6f0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
f700: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
f710: 2c 20 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b  , db, "foreign k
f720: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
f730: 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
f740: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
f750: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
f760: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
f770: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
f780: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
f790: 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
f7a0: 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
f7b0: 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
f7c0: 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
f7d0: 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
f7e0: 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
f7f0: 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
f800: 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
f810: 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
f820: 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
f830: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
f840: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
f850: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
f860: 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
f870: 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
f880: 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
f890: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
f8a0: 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
f8b0: 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
f8c0: 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
f8d0: 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
f8e0: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
f8f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
f900: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f910: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
f920: 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
f930: 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
f940: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
f950: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f960: 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
f970: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
f980: 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
f990: 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
f9a0: 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
f9b0: 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
f9c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f9d0: 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
f9e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
fa10: 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
fa20: 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
fa30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fa40: 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
fa50: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
fa60: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
fa70: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
fa80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
fa90: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
faa0: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
fab0: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
fac0: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
fad0: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
fae0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
faf0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
fb00: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
fb10: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
fb20: 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
fb30: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
fb40: 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
fb50: 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
fb60: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
fb70: 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
fb80: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
fb90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
fba0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
fbb0: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
fbc0: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
fbd0: 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
fbe0: 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
fbf0: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
fc00: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
fc10: 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
fc20: 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
fc30: 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
fc40: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
fc50: 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
fc60: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
fc70: 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
fc80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fc90: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
fca0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
fcb0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
fcc0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
fcd0: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
fce0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
fcf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fd00: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
fd10: 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
fd20: 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
fd30: 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
fd40: 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
fd50: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66   started */.  if
fd60: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
fd70: 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
fd80: 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
fd90: 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
fda0: 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
fdb0: 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
fdc0: 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
fdd0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
fde0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
fdf0: 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
fe00: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
fe10: 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
fe20: 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
fe30: 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
fe40: 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
fe50: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
fe60: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
fe70: 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
fe80: 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
fe90: 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74  0xff;.    assert
fea0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
feb0: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
fec0: 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
fed0: 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73  no longer exists
fee0: 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61   */.    isSpecia
fef0: 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
ff00: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
ff10: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
ff40: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
ff50: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
ff60: 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
ff70: 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
ff80: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
ff90: 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
ffa0: 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
ffb0: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
ffc0: 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
ffd0: 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
ffe0: 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
fff0: 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
10000 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
10010 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
10020 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
10030 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
10040 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
10050 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
10060 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
10070 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10080 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
10090 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
100a0 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
100b0 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
100c0 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
100d0 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
100e0 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
100f0 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
10100 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
10110 6f 63 63 75 72 65 64 20 77 68 69 6c 65 20 77 72  occured while wr
10120 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
10130 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
10140 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
10150 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
10160 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
10170 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
10180 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
10190 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
101a0 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
101b0 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
101c0 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
101d0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
101e0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
101f0 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
10200 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
10210 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
10220 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
10230 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
10240 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
10250 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
10260 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
10270 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
10280 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
10290 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
102a0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
102b0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
102c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
102d0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
102e0 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
102f0 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
10300 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
10310 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
10320 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
10330 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
10340 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
10350 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
10360 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
10370 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
10380 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
10390 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
103a0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
103b0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
103c0 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
103d0 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
103e0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
103f0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
10400 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
10410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10420 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10430 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
10440 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
10450 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
10460 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
10480 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
10490 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
104a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
104b0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
104c0 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
104d0 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
104e0 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
104f0 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
10500 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
10510 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
10520 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
10530 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
10540 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
10550 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
10560 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
10570 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
10580 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
10590 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
105a0 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
105b0 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
105c0 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
105d0 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
105e0 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
105f0 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70  writeVdbeCnt==(p
10600 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
10610 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
10620 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
10630 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
10640 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
10650 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
10660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
10670 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
10680 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
10690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
106a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
106b0 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
106c0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
106d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
106e0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
106f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10700 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
10710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10720 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10730 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
10740 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
10750 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
10760 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
10770 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
10780 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
10790 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
107a0 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
107b0 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
107c0 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
107d0 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
107e0 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
107f0 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
10800 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
10810 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
10820 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
10830 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
10840 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
10850 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
10860 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
10870 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
10880 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
10890 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
108a0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
108b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
108c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
108d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
108e0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
108f0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
10900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10910 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
10920 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10930 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
10940 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
10950 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
10960 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
10970 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
10980 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
10990 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
109a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
109b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
109c0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
109d0 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
109e0 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
109f0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
10a00 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
10a10 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
10a20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10a30 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
10a40 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
10a50 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
10a60 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
10a70 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
10a80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
10a90 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
10aa0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
10ab0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
10ac0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10ad0 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
10ae0 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
10af0 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
10b00 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a  fiedBtrees(db);.
10b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10b20 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
10b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
10b40 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
10b50 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
10b60 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
10b70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10b80 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
10b90 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
10ba0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
10bb0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
10bc0 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
10bd0 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
10be0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
10bf0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
10c00 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
10c10 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
10c20 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
10c30 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
10c40 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
10c50 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
10c60 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
10c70 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
10c80 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10c90 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
10ca0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
10cb0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
10cc0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  ror code..    **
10cd0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
10ce0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
10cf0 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 63 61  seStatement() ca
10d00 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20 65  n only fail if e
10d10 53 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20  StatementOp.    
10d20 2a 2a 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  ** is SAVEPOINT_
10d30 52 4f 4c 4c 42 41 43 4b 2e 20 20 42 75 74 20 69  ROLLBACK.  But i
10d40 66 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  f p->rc==SQLITE_
10d50 4f 4b 20 74 68 65 6e 20 65 53 74 61 74 65 6d 65  OK then eStateme
10d60 6e 74 4f 70 0a 20 20 20 20 2a 2a 20 6d 75 73 74  ntOp.    ** must
10d70 20 62 65 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   be SAVEPOINT_RE
10d80 4c 45 41 53 45 2e 20 20 48 65 6e 63 65 20 74 68  LEASE.  Hence th
10d90 65 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53  e NEVER(p->rc==S
10da0 51 4c 49 54 45 5f 4f 4b 29 20 69 6e 20 0a 20 20  QLITE_OK) in .  
10db0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
10dc0 6e 67 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a  ng code..    */.
10dd0 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
10de0 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63  ntOp ){.      rc
10df0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c   = sqlite3VdbeCl
10e00 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20  oseStatement(p, 
10e10 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20  eStatementOp);. 
10e20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
10e30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
10e40 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 53 41 56  StatementOp==SAV
10e50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10e60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e  );.        if( N
10e70 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  EVER(p->rc==SQLI
10e80 54 45 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72 63 3d  TE_OK) || p->rc=
10e90 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
10ea0 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
10eb0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
10ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
10ed0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
10ee0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
10ef0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
10f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10f10 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
10f20 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
10f30 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
10f40 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
10f50 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
10f60 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
10f70 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
10f80 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
10f90 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
10fa0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
10fb0 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
10fc0 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
10fd0 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
10fe0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10ff0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
11000 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
11010 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
11020 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11030 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
11040 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
11050 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
11060 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
11070 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
11080 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
11090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
110a0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
110b0 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
110c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
110d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
110e0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
110f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11100 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
11110 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
11120 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
11130 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
11140 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
11150 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
11160 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
11170 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
11180 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
11190 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
111a0 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
111b0 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b  lSchema(db, -1);
111c0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
111d0 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20   = (db->flags | 
111e0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
111f0 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nges);.    }..  
11200 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
11210 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
11220 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
11230 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
11240 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
11250 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
11260 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
11270 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
11280 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11290 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
112a0 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  veVdbeCnt--;.   
112b0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
112c0 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77  y ){.      db->w
112d0 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  riteVdbeCnt--;. 
112e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
112f0 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
11300 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  nt>=db->writeVdb
11310 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  eCnt );.  }.  p-
11320 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
11330 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
11340 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
11350 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
11360 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11370 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
11380 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
11390 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
113a0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
113b0 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
113c0 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
113d0 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
113e0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
113f0 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
11400 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
11410 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
11420 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
11430 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
11440 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
11450 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
11460 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
11470 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
11480 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
11490 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
114a0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
114b0 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
114c0 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
114d0 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
114e0 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
114f0 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
11500 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
11510 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
11520 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
11530 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
11540 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
11550 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
11560 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
11570 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
11580 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
11590 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
115a0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
115b0 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
115c0 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
115d0 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
115e0 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
115f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
11600 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
11610 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
11620 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
11630 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
11640 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
11650 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
11660 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
11670 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
11680 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
11690 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
116a0 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
116b0 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
116c0 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
116d0 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
116e0 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
116f0 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
11700 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
11710 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
11720 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
11730 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
11740 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
11750 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
11760 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
11770 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
11780 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
11790 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
117a0 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
117b0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
117c0 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
117d0 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
117e0 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
117f0 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
11800 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
11810 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
11820 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
11830 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
11840 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
11850 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
11860 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11870 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
11880 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
11890 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
118a0 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
118b0 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
118c0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
118d0 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
118e0 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
118f0 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
11900 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
11910 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
11920 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
11930 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
11940 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
11950 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
11960 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
11970 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
11980 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
11990 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
119a0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
119b0 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
119c0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
119d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
119e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
119f0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
11a00 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
11a10 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49  SQLITE_UTF8,SQLI
11a20 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11a30 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
11a40 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11a50 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65       db->errCode
11a60 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20   = p->rc;.      
11a70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11a80 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11a90 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
11aa0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
11ab0 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
11ac0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11ad0 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
11ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
11af0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
11b00 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
11b10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
11b20 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
11b30 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
11b40 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
11b50 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
11b60 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
11b70 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
11b80 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
11b90 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
11ba0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
11bb0 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
11bc0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
11bd0 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
11be0 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
11bf0 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
11c00 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
11c10 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
11c20 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
11c30 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
11c40 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
11c50 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
11c60 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
11c70 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
11c80 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
11c90 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
11ca0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11cb0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11cc0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
11cd0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
11ce0 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
11cf0 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
11d00 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
11d10 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
11d20 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
11d30 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
11d40 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
11d50 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
11d60 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
11d70 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
11d80 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
11d90 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
11da0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
11db0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
11dc0 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
11dd0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11de0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
11df0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
11e00 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
11e10 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
11e20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
11e30 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
11e40 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11e50 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
11e60 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
11e70 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
11e80 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
11e90 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
11ea0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
11eb0 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
11ec0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
11ed0 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
11ee0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
11ef0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
11f00 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
11f10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
11f20 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
11f30 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
11f40 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
11f50 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
11f60 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
11f70 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
11f80 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
11f90 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
11fa0 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
11fb0 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
11fc0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
11fd0 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
11fe0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
11ff0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
12000 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
12010 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
12020 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
12030 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
12040 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
12050 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
12060 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12070 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
12080 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
12090 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
120a0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
120b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
120c0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
120d0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
120e0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
120f0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
12100 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
12110 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
12130 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
12140 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
12150 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
12160 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
12170 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
12180 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
12190 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
121a0 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
121b0 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
121c0 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
121d0 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
121e0 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
121f0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
12200 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
12210 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
12220 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
12230 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
12240 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
12250 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
12260 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
12270 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
12280 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
12290 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
122a0 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
122b0 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
122c0 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c  (mask&(((u32)1)<
122d0 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
122e0 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
122f0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
12300 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
12310 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
12320 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
12330 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
12340 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
12350 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
12360 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
12370 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
12380 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
12390 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
123a0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
123b0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
123c0 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
123d0 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
123e0 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
123f0 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
12400 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
12410 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
12420 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12430 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
12440 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
12450 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
12460 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 73 71 6c  DeleteObject(sql
12470 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
12480 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
12490 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
124a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
124b0 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
124c0 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
124d0 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
124e0 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73  >nVar);.  releas
124f0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
12500 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
12510 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
12520 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70  .  for(pSub=p->p
12530 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70  Program; pSub; p
12540 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Sub=pNext){.    
12550 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e  pNext = pSub->pN
12560 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65  ext;.    vdbeFre
12570 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75  eOpArray(db, pSu
12580 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f  b->aOp, pSub->nO
12590 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
125a0 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b  bFree(db, pSub);
125b0 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f  .  }.  vdbeFreeO
125c0 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
125d0 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
125e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
125f0 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
12600 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12610 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
12620 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12630 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71  , p->zSql);.  sq
12640 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12650 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 6c  p->pFree);.  sql
12660 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12670 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
12680 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
12690 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
126a0 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
126b0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
126c0 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
126d0 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
126e0 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
126f0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
12700 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
12710 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
12720 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
12730 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
12740 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
12750 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
12760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
12770 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
12780 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
12790 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
127a0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
127b0 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
127c0 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
127d0 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74  VdbeDeleteObject
127e0 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
127f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
12800 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
12810 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
12820 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
12830 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
12840 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
12850 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
12860 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
12870 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
12880 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
12890 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
128a0 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
128b0 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
128c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
128d0 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
128e0 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
128f0 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
12900 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
12910 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
12920 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
12930 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
12940 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
12950 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
12960 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
12970 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
12980 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
12990 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
129a0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
129b0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
129c0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
129d0 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
129e0 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
129f0 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
12a00 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
12a10 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
12a20 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
12a30 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
12a40 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
12a50 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
12a60 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
12a70 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
12a80 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
12a90 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
12aa0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
12ab0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12ac0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
12ad0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ount;.#endif.   
12ae0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61   assert( p->isTa
12af0 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ble );.    rc = 
12b00 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
12b10 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43  toUnpacked(p->pC
12b20 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
12b30 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
12b40 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  es);.    if( rc 
12b50 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12b60 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20   p->lastRowid = 
12b70 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b  p->movetoTarget;
12b80 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20  .    if( res!=0 
12b90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12ba0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
12bb0 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69    p->rowidIsVali
12bc0 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  d = 1;.#ifdef SQ
12bd0 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
12be0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
12bf0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
12c00 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
12c10 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63  to = 0;.    p->c
12c20 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
12c30 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73  HE_STALE;.  }els
12c40 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e  e if( ALWAYS(p->
12c50 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
12c60 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20  int hasMoved;.  
12c70 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
12c80 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
12c90 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
12ca0 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20  , &hasMoved);.  
12cb0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12cc0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61  n rc;.    if( ha
12cd0 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20  sMoved ){.      
12ce0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
12cf0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
12d00 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d      p->nullRow =
12d10 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
12d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
12d40 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
12d50 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
12d60 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
12d70 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
12d80 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
12d90 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
12da0 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
12db0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
12dc0 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
12dd0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
12de0 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
12df0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
12e00 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
12e10 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
12e20 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
12e30 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
12e40 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
12e50 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
12e60 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
12e70 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
12e80 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
12e90 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
12ea0 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
12eb0 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
12ec0 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
12ed0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
12ee0 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
12ef0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
12f00 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
12f10 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
12f20 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
12f30 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
12f40 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
12f50 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
12f60 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
12f70 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
12f80 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
12f90 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
12fa0 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
12fb0 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
12fc0 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
12fd0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
12fe0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
12ff0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
13000 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65  d data blob sepe
13010 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
13020 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
13030 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
13040 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
13050 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
13060 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
13070 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
13080 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
13090 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
130a0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
130d0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
130f0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
13100 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
13120 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
13130 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13140 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
13150 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
13160 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13170 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
131a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
131b0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
131c0 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
131d0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
131e0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
131f0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
13200 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
13210 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13220 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13240 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
13250 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13260 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
13270 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
13280 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
13290 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
132c0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
132d0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
132f0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
13300 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
13310 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
13340 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
13350 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
13360 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
13370 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
13380 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
13390 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
133a0 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
133b0 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
133c0 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
133d0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
133e0 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
133f0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
13400 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
13410 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
13420 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
13430 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
13440 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
13450 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
13460 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
13470 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
13480 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
13490 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
134a0 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
134b0 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
134c0 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
134d0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
134e0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
134f0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
13500 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
13510 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
13520 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
13530 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
13540 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
13550 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
13560 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
13570 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
13580 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
13590 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
135a0 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
135b0 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
135c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
135d0 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d   8+(u32)i;.    }
135e0 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  .    if( i<0 ){.
135f0 20 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41        if( i<(-MA
13600 58 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 72  X_6BYTE) ) retur
13610 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72  n 6;.      /* Pr
13620 65 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 76  evious test prev
13630 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32  ents:  u = -(-92
13640 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
13650 38 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20  8) */.      u = 
13660 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -i;.    }else{. 
13670 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
13680 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
13690 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
136a0 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
136b0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
136c0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
136d0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
136e0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
136f0 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
13700 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
13710 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
13720 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
13730 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
13740 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
13750 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
13760 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  ( pMem->db->mall
13770 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67  ocFailed || flag
13780 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
13790 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d  lob) );.  n = pM
137a0 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61  em->n;.  if( fla
137b0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
137c0 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e  .    n += pMem->
137d0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61  u.nZero;.  }.  a
137e0 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
137f0 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
13800 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
13810 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
13820 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13830 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
13840 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
13850 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
13860 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
13870 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
13880 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
13890 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
138a0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
138b0 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
138c0 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
138d0 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
138e0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
138f0 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
13900 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
13910 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
13920 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
13930 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
13940 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
13950 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
13960 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
13970 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
13980 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
13990 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
139a0 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
139b0 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
139c0 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
139d0 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
139e0 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
139f0 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
13a00 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
13a10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13a20 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
13a30 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
13a40 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
13a50 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
13a60 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
13a70 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
13a80 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
13a90 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
13aa0 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
13ab0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
13ac0 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
13ad0 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
13ae0 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
13af0 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
13b00 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
13b10 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
13b20 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
13b30 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
13b40 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
13b50 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
13b60 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
13b70 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
13b80 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
13b90 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
13ba0 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
13bb0 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
13bc0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
13bd0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
13be0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
13bf0 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
13c00 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
13c10 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
13c20 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
13c30 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
13c40 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
13c50 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
13c60 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
13c70 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
13c80 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
13c90 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
13ca0 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
13cb0 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
13cc0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
13cd0 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
13ce0 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
13cf0 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
13d00 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
13d10 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
13d20 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
13d30 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
13d40 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
13d50 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
13d60 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
13d70 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
13d80 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
13d90 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
13da0 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
13db0 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
13dc0 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
13dd0 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
13de0 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
13df0 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
13e00 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
13e10 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
13e20 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
13e30 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
13e40 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
13e50 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
13e60 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
13e70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
13e80 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
13e90 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
13ea0 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
13eb0 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
13ec0 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
13ed0 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
13ee0 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
13ef0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
13f00 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
13f10 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
13f20 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
13f30 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
13f40 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
13f50 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
13f60 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
13f70 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
13f80 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
13f90 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
13fa0 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
13fb0 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
13fc0 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
13fd0 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
13fe0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
13ff0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
14000 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
14010 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
14020 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
14030 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
14040 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
14050 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
14060 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
14070 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
14080 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
14090 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
140a0 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
140b0 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
140c0 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
140d0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
140e0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
140f0 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
14100 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
14110 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
14120 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
14130 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
14140 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
14150 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
14160 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
14170 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
14180 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
14190 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
141a0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
141b0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
141c0 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
141d0 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
141e0 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20  f[].  nBuf must 
141f0 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72  always be.** lar
14200 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
14210 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
14220 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ld.  Except, if 
14230 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20  the field is.** 
14240 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65  a blob with a ze
14250 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20  ro-filled tail, 
14260 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74  then buf[] might
14270 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67   be just the rig
14280 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f  ht.** size to ho
14290 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78  ld everything ex
142a0 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72  cept for the zer
142b0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20  o-filled tail.  
142c0 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f  If buf[].** is o
142d0 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74  nly big enough t
142e0 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a  o hold the non-z
142f0 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e  ero prefix, then
14300 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74   only write that
14310 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20  .** prefix into 
14320 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62  buf[].  But if b
14330 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e  uf[] is large en
14340 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74  ough to hold bot
14350 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20  h the.** prefix 
14360 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65  and the tail the
14370 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66  n write the pref
14380 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74  ix and set the t
14390 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65  ail to all.** ze
143a0 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ros..**.** Retur
143b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
143c0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
143d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
143e0 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
143f0 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
14400 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
14410 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
14420 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
14430 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
14440 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
14450 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
14460 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
14470 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
14480 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20  *buf, int nBuf, 
14490 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
144a0 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75  ile_format){.  u
144b0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  32 serial_type =
144c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
144d0 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c  alType(pMem, fil
144e0 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32  e_format);.  u32
144f0 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
14500 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
14510 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
14520 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
14530 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
14540 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
14550 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
14560 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
14570 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
14580 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
14590 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
145a0 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
145b0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
145c0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
145d0 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
145e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
145f0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
14600 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
14610 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14620 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
14630 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
14640 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66  ( len<=(u32)nBuf
14650 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   );.    while( i
14660 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b  -- ){.      buf[
14670 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
14680 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
14690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
146a0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
146b0 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
146c0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
146d0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
146e0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
146f0 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
14700 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
14710 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
14720 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
14730 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
14740 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
14750 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
14760 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c  assert( pMem->n<
14770 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e  =nBuf );.    len
14780 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
14790 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
147a0 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69  ->z, len);.    i
147b0 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
147c0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
147d0 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e     len += pMem->
147e0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61  u.nZero;.      a
147f0 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29  ssert( nBuf>=0 )
14800 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20  ;.      if( len 
14810 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20  > (u32)nBuf ){. 
14820 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33         len = (u3
14830 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a  2)nBuf;.      }.
14840 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75        memset(&bu
14850 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c  f[pMem->n], 0, l
14860 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20  en-pMem->n);.   
14870 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
14880 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
14890 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
148a0 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
148b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
148c0 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
148d0 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
148e0 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
148f0 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
14900 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
14910 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
14920 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
14930 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14940 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20  s read..*/ .u32 
14950 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14960 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
14970 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
14980 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
14990 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
149a0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
149b0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
149c0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
149d0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
149e0 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
149f0 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
14a00 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
14a10 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
14a20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
14a30 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
14a40 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
14a50 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
14a60 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
14a70 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
14a80 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
14a90 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
14aa0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
14ab0 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
14ac0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14ad0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
14ae0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14af0 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
14b00 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
14b10 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
14b20 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e  Mem->u.i = (sign
14b30 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
14b40 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14b50 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14b60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14b70 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
14b80 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
14b90 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14ba0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
14bb0 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
14bc0 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
14bd0 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  1];.      pMem->
14be0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
14bf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
14c00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14c10 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
14c20 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14c30 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
14c40 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
14c50 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c  r)buf[0])<<16) |
14c60 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62   (buf[1]<<8) | b
14c70 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[2];.      pMe
14c80 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
14c90 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
14ca0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
14cb0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
14cc0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
14cd0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
14ce0 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32  u.i = (buf[0]<<2
14cf0 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
14d00 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
14d10 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
14d20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14d30 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
14d40 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 4;.    }.   
14d50 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
14d60 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14d70 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  ger */.      u64
14d80 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63   x = (((signed c
14d90 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
14da0 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
14db0 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c  u32 y = (buf[2]<
14dc0 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c  <24) | (buf[3]<<
14dd0 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38  16) | (buf[4]<<8
14de0 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20  ) | buf[5];.    
14df0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
14e00 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  y;.      pMem->u
14e10 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
14e20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14e30 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14e40 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
14e50 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
14e60 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
14e70 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14e80 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
14e90 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
14ea0 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  t */.      u64 x
14eb0 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23  ;.      u32 y;.#
14ec0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
14ed0 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
14ee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
14ef0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
14f00 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
14f10 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
14f20 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
14f30 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
14f40 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  .      ** byte o
14f50 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
14f60 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
14f70 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
14f80 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  AT is.      ** d
14f90 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
14fa0 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
14fb0 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
14fc0 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20  are mixed.      
14fd0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20  ** endian..     
14fe0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
14ff0 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
15000 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
15010 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61  )<<32;.      sta
15020 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
15030 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20   r1 = 1.0;.     
15040 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
15050 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
15060 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
15070 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
15080 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
15090 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
150a0 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
150b0 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
150c0 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b  .      x = (buf[
150d0 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
150e0 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
150f0 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
15100 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d       y = (buf[4]
15110 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c  <<24) | (buf[5]<
15120 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c  <16) | (buf[6]<<
15130 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20  8) | buf[7];.   
15140 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
15150 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   y;.      if( se
15160 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
15170 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e          pMem->u.
15180 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
15190 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
151a0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
151b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
151c0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
151d0 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
151e0 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b  f(pMem->r)==8 );
151f0 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78  .        swapMix
15200 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
15210 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
15220 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73  (&pMem->r, &x, s
15230 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20  izeof(x));.     
15240 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15250 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
15260 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  em->r) ? MEM_Nul
15270 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
15280 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
15290 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 8;.    }.    
152a0 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
152b0 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
152c0 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
152d0 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
152e0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
152f0 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
15300 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
15310 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
15320 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
15330 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
15340 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65     u32 len = (se
15350 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
15360 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
15370 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
15380 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65      pMem->n = le
15390 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78  n;.      pMem->x
153a0 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Del = 0;.      i
153b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30  f( serial_type&0
153c0 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  x01 ){.        p
153d0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
153e0 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  _Str | MEM_Ephem
153f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15400 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
15410 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20  gs = MEM_Blob | 
15420 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
15430 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
15440 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  len;.    }.  }. 
15450 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
15460 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
15470 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
15480 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
15490 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20 74   pKey[], parse t
154a0 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74  he.** record int
154b0 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  o a UnpackedReco
154c0 72 64 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  rd structure.  R
154d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
154e0 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75 63  to.** that struc
154f0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
15500 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
15510 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 73   might provide s
15520 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f 66 20  zSpace bytes of 
15530 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
15540 61 74 20 70 53 70 61 63 65 2e 20 20 54 68 69 73  at pSpace.  This
15550 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 75 73   space can be us
15560 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ed to hold the r
15570 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65 50  eturned.** VDbeP
15580 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72 75  arsedRecord stru
15590 63 74 75 72 65 20 69 66 20 69 74 20 69 73 20 6c  cture if it is l
155a0 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49 66  arge enough.  If
155b0 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 69   it is.** not bi
155c0 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65 20  g enough, space 
155d0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
155e0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
155f0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  )..**.** The ret
15600 75 72 6e 65 64 20 73 74 72 75 63 74 75 72 65 20  urned structure 
15610 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
15620 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a   by a call to.**
15630 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
15640 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
15650 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 64  ()..*/ .Unpacked
15660 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
15670 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
15680 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
15690 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
156a0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
156b0 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
156c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156e0 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
156f0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
15700 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
15710 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
15720 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
15730 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
15740 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
15750 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
15760 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ble to hold the 
15770 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
15780 73 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20  szSpace         
15790 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
157a0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
157b0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
157c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
157d0 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
157e0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
157f0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
15800 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20 75 6e  d *p;  /* The un
15810 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 68  packed record th
15820 61 74 20 77 65 20 77 69 6c 6c 20 72 65 74 75 72  at we will retur
15830 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  n */.  int nByte
15840 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65  ;          /* Me
15850 6d 6f 72 79 20 73 70 61 63 65 20 6e 65 65 64 65  mory space neede
15860 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69 6e 20  d to hold p, in 
15870 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64  bytes */.  int d
15880 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
15890 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
158a0 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
158b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
158c0 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
158d0 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 6e  m *pMem;.  int n
158e0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Off;           /
158f0 2a 20 49 6e 63 72 65 61 73 65 20 70 53 70 61 63  * Increase pSpac
15900 65 20 62 79 20 74 68 69 73 20 6d 75 63 68 20 74  e by this much t
15910 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 20 69  o 8-byte align i
15920 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  t */.  .  /*.  *
15930 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69  * We want to shi
15940 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  ft the pointer p
15950 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68  Space up such th
15960 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20  at it is 8-byte 
15970 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68  aligned..  ** Th
15980 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63  us, we need to c
15990 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65  alculate a value
159a0 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20  , nOff, between 
159b0 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66  0 and 7, to shif
159c0 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20  t .  ** it by.  
159d0 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72  If pSpace is alr
159e0 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67  eady 8-byte alig
159f0 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64  ned, nOff should
15a00 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20   be zero..  */. 
15a10 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51   nOff = (8 - (SQ
15a20 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
15a30 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20  pSpace) & 7)) & 
15a40 37 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d 20 6e  7;.  pSpace += n
15a50 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63 65 20 2d  Off;.  szSpace -
15a60 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74 65 20  = nOff;.  nByte 
15a70 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
15a80 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
15a90 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
15aa0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
15ab0 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  +1);.  if( nByte
15ac0 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20 20  >szSpace ){.    
15ad0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
15ae0 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
15af0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
15b00 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
15b10 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  rn 0;.    p->fla
15b20 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs = UNPACKED_NE
15b30 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43 4b  ED_FREE | UNPACK
15b40 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
15b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
15b60 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
15b70 64 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20 70  d*)pSpace;.    p
15b80 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
15b90 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
15ba0 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  .  }.  p->pKeyIn
15bb0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
15bc0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
15bd0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
15be0 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 70  1;.  p->aMem = p
15bf0 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
15c00 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
15c10 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
15c20 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
15c30 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
15c40 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
15c50 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
15c60 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
15c70 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
15c80 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
15c90 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75  ( idx<szHdr && u
15ca0 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c  <p->nField && d<
15cb0 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
15cc0 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
15cd0 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
15ce0 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
15cf0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
15d00 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
15d10 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
15d20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
15d30 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
15d40 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
15d50 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
15d60 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
15d70 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15d80 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
15d90 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
15da0 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
15db0 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
15dc0 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
15dd0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
15de0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
15df0 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  u;.  return (voi
15e00 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  d*)p;.}../*.** T
15e10 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74  his routine dest
15e20 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52  roys a UnpackedR
15e30 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a 2f  ecord object..*/
15e40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
15e50 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
15e60 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65  ecord(UnpackedRe
15e70 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 6e 74 20  cord *p){.  int 
15e80 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a  i;.  Mem *pMem;.
15e90 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
15ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
15eb0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
15ec0 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29 3b  _NEED_DESTROY );
15ed0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d  .  for(i=0, pMem
15ee0 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e  =p->aMem; i<p->n
15ef0 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d  Field; i++, pMem
15f00 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++){.    /* The 
15f10 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  unpacked record 
15f20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 72  is always constr
15f30 75 63 74 65 64 20 62 79 20 74 68 65 0a 20 20 20  ucted by the.   
15f40 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 55   ** sqlite3VdbeU
15f50 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
15f60 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68  nction above, wh
15f70 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20  ich makes all.  
15f80 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64    ** strings and
15f90 20 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20 20   blobs static.  
15fa0 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
15fb0 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20 20  elements are.   
15fc0 20 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66 6f   ** ever transfo
15fd0 72 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69  rmed, so there i
15fe0 73 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e 67  s never anything
15ff0 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 20   to delete..    
16000 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
16010 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20  (pMem->zMalloc) 
16020 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
16030 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
16040 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
16050 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
16060 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73 71  D_FREE ){.    sq
16070 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
16080 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
16090 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
160a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
160b0 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
160c0 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
160d0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
160e0 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
160f0 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
16100 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
16110 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
16120 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
16130 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
16140 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
16150 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
16160 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
16170 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
16180 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
16190 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
161a0 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65  ed by th OP_Make
161b0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
161c0 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
161d0 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
161e0 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
161f0 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
16200 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
16210 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
16220 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  rd..**.** Key1 a
16230 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
16240 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
16250 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16260 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65  f fields..** The
16270 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20   key with fewer 
16280 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c  fields is usuall
16290 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20  y compares less 
162a0 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e  than the .** lon
162b0 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65  ger key.  Howeve
162c0 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
162d0 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20  D_INCRKEY flags 
162e0 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74  in pPKey2 is set
162f0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d  .** and the comm
16300 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20  on prefixes are 
16310 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31  equal, then key1
16320 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65   is less than ke
16330 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65  y2..** Or if the
16340 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f   UNPACKED_MATCH_
16350 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73  PREFIX flag is s
16360 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69  et and the prefi
16370 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  xes are.** equal
16380 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20  , then the keys 
16390 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
163a0 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a  o be equal and.*
163b0 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f  * the parts beyo
163c0 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
163d0 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64  efix are ignored
163e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55  ..**.** If the U
163f0 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
16400 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65 74  OWID flag is set
16410 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
16420 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68  byte of.** the h
16430 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69  eader of pKey1 i
16440 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69  s ignored.  It i
16450 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 70  s assumed that p
16460 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  Key1 is.** an in
16470 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75  dex key, and thu
16480 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f  s ends with a ro
16490 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20  wid value.  The 
164a0 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20  last byte.** of 
164b0 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20  the header will 
164c0 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68 65  therefore be the
164d0 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
164e0 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e  the rowid:.** on
164f0 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c  e of 1, 2, 3, 4,
16500 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d   5, 6, 8, or 9 -
16510 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65 72   the integer ser
16520 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68  ial types..** Th
16530 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
16540 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
16550 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
16560 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
16570 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68  * By ignoring th
16580 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  is last byte of 
16590 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 66  the header, we f
165a0 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  orce the compari
165b0 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  son.** to ignore
165c0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
165d0 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a  e end of key1..*
165e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
165f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
16600 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
16610 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
16620 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
16630 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
16640 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
16650 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
16660 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20  {.  int d1;     
16670 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
16680 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
16690 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
166a0 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
166b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
166c0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
166d0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
166e0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
166f0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
16700 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16710 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
16720 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
16730 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
16740 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
16750 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
16760 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
16770 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
16780 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
16790 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
167a0 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
167b0 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
167c0 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  Info;.  mem1.enc
167d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
167e0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
167f0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
16800 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
16810 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
16820 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
16830 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
16840 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
16850 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
16860 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
16870 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
16880 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
16890 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
168a0 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
168b0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
168c0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
168d0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
168e0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
168f0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
16900 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
16910 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
16920 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
16930 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
16940 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
16950 62 65 20 75 73 65 64 20 69 6e 69 74 69 61 6c 69  be used initiali
16960 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
16970 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
16980 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
16990 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
169a0 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
169b0 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
169c0 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
169d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
169e0 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
169f0 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
16a00 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
16a10 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
16a20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
16a30 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
16a40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16a50 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
16a60 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
16a70 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
16a80 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
16a90 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
16aa0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
16ab0 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
16ac0 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
16ad0 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32  r1;.  if( pPKey2
16ae0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
16af0 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
16b00 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b  ){.    szHdr1--;
16b10 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20  .  }.  nField = 
16b20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
16b30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c  ;.  while( idx1<
16b40 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
16b50 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  y2->nField ){.  
16b60 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16b70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
16b80 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
16b90 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
16ba0 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
16bb0 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
16bc0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
16bd0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
16be0 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
16bf0 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
16c00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16c10 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
16c20 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
16c30 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  k;..    /* Extra
16c40 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
16c50 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
16c60 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
16c70 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16c80 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
16c90 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
16ca0 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
16cb0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
16cc0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
16cd0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
16ce0 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
16cf0 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d10 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f        i<nField ?
16d20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16d30 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
16d40 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
16d50 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
16d60 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
16d70 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
16d80 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w */..      /* I
16d90 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
16da0 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
16db0 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
16dc0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
16dd0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
16de0 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64 20  der && i<nField 
16df0 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
16e00 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
16e10 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
16e20 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
16e30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45     /* If the PRE
16e40 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
16e50 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66  is set and all f
16e60 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65  ields except the
16e70 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20   final.      ** 
16e80 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65  rowid field were
16e90 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65   equal, then cle
16ea0 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  ar the PREFIX_SE
16eb0 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65  ARCH flag and se
16ec0 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65  t .      ** pPKe
16ed0 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65  y2->rowid to the
16ee0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
16ef0 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b  wid field in (pK
16f00 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20  ey1, nKey1)..   
16f10 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73     ** This is us
16f20 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
16f30 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20  nique opcode..  
16f40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16f50 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20   (pPKey2->flags 
16f60 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
16f70 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d  X_SEARCH) && i==
16f80 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d  (pPKey2->nField-
16f90 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  1) ){.        as
16fa0 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64  sert( idx1==szHd
16fb0 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20  r1 && rc );.    
16fc0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
16fd0 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  .flags & MEM_Int
16fe0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65   );.        pPKe
16ff0 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e  y2->flags &= ~UN
17000 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
17010 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50  ARCH;.        pP
17020 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65  Key2->rowid = me
17030 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  m1.u.i;.      }.
17040 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72      .      retur
17050 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17060 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  i++;.  }..  /* N
17070 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
17080 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
17090 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
170a0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
170b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
170c0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
170d0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
170e0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
170f0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
17100 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
17110 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
17120 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
17130 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17140 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
17150 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
17160 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
17170 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
17180 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
17190 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
171a0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
171b0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
171c0 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e  equal. If the UN
171d0 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20  PACKED_INCRKEY. 
171e0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
171f0 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20   then break the 
17200 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20  tie by treating 
17210 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a  key2 as larger..
17220 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43    ** If the UPAC
17230 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
17240 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
17250 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d  en keys with com
17260 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a  mon prefixes.  *
17270 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
17280 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
17290 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
172a0 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
172b0 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41  .  ** larger.  A
172c0 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
172d0 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
172e0 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
172f0 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  er.  ** if there
17300 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65   is a difference
17310 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17320 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20   rc==0 );.  if( 
17330 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
17340 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
17350 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b   ){.    rc = -1;
17360 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
17370 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
17380 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
17390 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61  CH ){.    /* Lea
173a0 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65  ve rc==0 */.  }e
173b0 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48  lse if( idx1<szH
173c0 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  dr1 ){.    rc = 
173d0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
173e0 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70  rc;.}. ../*.** p
173f0 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
17400 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
17410 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
17420 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
17430 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
17440 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
17450 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
17460 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
17470 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
17480 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
17490 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
174a0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
174b0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
174c0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
174d0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
174e0 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
174f0 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
17500 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
17510 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
17520 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
17530 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
17540 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
17550 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
17560 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
17570 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
17580 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
17590 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
175a0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
175b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
175c0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
175d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
175e0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
175f0 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
17600 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
17610 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
17620 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
17630 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
17640 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
17650 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  m, v;..  UNUSED_
17660 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a  PARAMETER(db);..
17670 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
17680 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
17690 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
176a0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
176b0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
176c0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
176d0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
176e0 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
176f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
17700 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
17710 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
17720 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
17730 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
17740 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
17750 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
17760 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
17770 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
17780 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
17790 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
177a0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
177b0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
177c0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
177d0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
177e0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
177f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
17800 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
17810 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
17820 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
17830 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
17840 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
17850 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
17860 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
17870 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
17880 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
17890 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
178a0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   */.  memset(&m,
178b0 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
178c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
178d0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
178e0 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
178f0 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
17900 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17910 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17920 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
17930 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
17940 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
17950 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
17960 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
17970 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
17980 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
17990 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
179a0 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
179b0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
179c0 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
179d0 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
179e0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
179f0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
17a00 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
17a10 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
17a20 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
17a30 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
17a40 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
17a50 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
17a60 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
17a70 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
17a80 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
17a90 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
17aa0 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
17ab0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17ac0 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
17ad0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17ae0 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
17af0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
17b00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17b10 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
17b20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17b30 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
17b40 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17b50 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
17b60 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
17b70 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17b80 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
17b90 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
17ba0 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
17bb0 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
17bc0 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
17bd0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
17be0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
17bf0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
17c00 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17c10 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
17c20 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
17c30 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
17c40 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
17c50 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
17c60 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
17c70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17c80 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17c90 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
17ca0 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
17cb0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
17cc0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
17cd0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
17ce0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
17cf0 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
17d00 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
17d10 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
17d20 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
17d30 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
17d40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17d50 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
17d60 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
17d70 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
17d80 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
17d90 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
17da0 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
17db0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
17dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17dd0 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
17de0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
17df0 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
17e00 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
17e10 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
17e20 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
17e30 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17e40 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
17e50 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
17e60 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
17e70 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
17e80 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
17e90 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
17ea0 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
17eb0 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
17ec0 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
17ed0 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
17ee0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
17ef0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
17f00 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
17f10 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
17f20 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
17f30 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
17f40 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
17f50 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
17f60 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
17f70 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
17f80 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
17f90 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
17fa0 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
17fb0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
17fc0 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
17fd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
17fe0 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
17ff0 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
18000 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
18010 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
18020 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
18030 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
18040 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
18050 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
18060 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
18070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18080 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
18090 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
180a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
180b0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
180c0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
180d0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
180e0 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
180f0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
18100 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f  ion of key to co
18110 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
18120 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18140 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
18150 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
18160 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
18170 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
18180 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
18190 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
181a0 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
181b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
181c0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
181d0 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
181e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
181f0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
18200 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
18210 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
18220 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
18230 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
18240 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
18250 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
18260 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
18270 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
18280 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
18290 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
182a0 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  say.  ** that bt
182b0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
182c0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
182d0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
182e0 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
182f0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
18300 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
18310 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
18320 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
18330 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18340 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
18350 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
18360 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
18370 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
18380 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
18390 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
183a0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
183b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
183c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
183d0 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
183e0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
183f0 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
18400 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
18410 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
18420 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
18430 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
18440 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
18450 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
18460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18470 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18480 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
18490 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
184a0 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
184b0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
184c0 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
184d0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
184e0 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
184f0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
18500 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
18510 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
18520 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
18530 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18540 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18550 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
18560 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
18570 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
18580 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
18590 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
185a0 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
185b0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
185c0 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
185d0 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
185e0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
185f0 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
18600 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
18610 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
18620 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
18630 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
18640 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
18650 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
18660 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18670 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
18680 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
18690 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
186a0 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
186b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
186c0 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
186d0 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
186e0 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
186f0 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
18700 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
18710 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
18720 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
18730 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
18740 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
18750 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
18760 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
18770 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
18780 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
18790 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
187a0 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
187b0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
187c0 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
187d0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
187e0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
187f0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
18800 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
18810 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
18820 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
18830 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
18840 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
18850 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
18860 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
18870 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
18880 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
18890 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
188a0 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
188b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
188c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
188d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
188e0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
188f0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
18900 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
18910 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
18920 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
18930 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
18940 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
18950 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
18960 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
18970 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
18980 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
18990 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
189a0 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
189b0 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
189c0 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
189d0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
189e0 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
189f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
18a00 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
18a10 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
18a20 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
18a30 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64  3VdbeGetValue(Vd
18a40 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
18a50 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
18a60 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
18a70 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
18a80 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
18a90 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
18aa0 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
18ab0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
18ac0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18ad0 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
18ae0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
18af0 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
18b00 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
18b10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
18b20 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
18b30 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
18b40 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
18b50 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
18b60 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
18b70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18b80 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
18b90 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a  e((Mem *)pRet);.
18ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18bb0 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
18bc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
18be0 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
18bf0 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
18c00 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
18c10 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
18c20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
18c30 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
18c40 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
18c50 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
18c60 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
18c70 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
18c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18c90 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
18ca0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
18cb0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
18cc0 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
18cd0 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
18ce0 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
18cf0 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
18d00 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
18d10 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
18d20 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a              -1));.  }.}.