/ Hex Artifact Content
Login

Artifact 5b8150112b490360fdf46f62f470a2ef75b0480a:


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 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
f200: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f210: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
f220: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
f230: 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
f240: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
f250: 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
f260: 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
f270: 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
f280: 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
f290: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
f2a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f2b0: 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
f2c0: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f2d0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f2e0: 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
f2f0: 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
f300: 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d  mtDefCons;.    }
f310: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
f320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f330: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
f340: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
f350: 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
f360: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
f370: 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
f380: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
f390: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
f3a0: 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
f3b0: 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
f3c0: 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
f3d0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
f3e0: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
f3f0: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
f400: 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
f410: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
f420: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
f430: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
f440: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
f450: 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
f460: 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
f470: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
f480: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
f490: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
f4a0: 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
f4b0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
f4c0: 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72   write.** an err
f4d0: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
f4e0: 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
f4f0: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
f500: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f510: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
f520: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
f530: 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
f540: 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
f550: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
f560: 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
f570: 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66  rred && db->nDef
f580: 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20  erredCons>0) || 
f590: 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
f5a0: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
f5b0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
f5c0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
f5d0: 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  NT;.    p->error
f5e0: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
f5f0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
f600: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
f610: 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67  Msg, db, "foreig
f620: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
f630: 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
f640: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
f650: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
f660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
f670: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
f680: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f690: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
f6a0: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
f6b0: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
f6c0: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
f6d0: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
f6e0: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
f6f0: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
f700: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
f710: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
f720: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
f730: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
f740: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f750: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
f760: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
f770: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
f780: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
f790: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
f7a0: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
f7b0: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
f7c0: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
f7d0: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
f7e0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
f7f0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
f800: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f810: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
f820: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
f830: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
f840: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
f850: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
f860: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
f870: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
f880: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
f890: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
f8a0: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
f8b0: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
f8c0: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
f8d0: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
f8e0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
f910: 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
f920: 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
f930: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
f940: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
f950: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
f960: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
f970: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
f980: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
f990: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
f9a0: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
f9b0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
f9c0: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
f9d0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
f9e0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
f9f0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
fa00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
fa10: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
fa20: 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
fa30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
fa40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
fa50: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
fa60: 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
fa70: 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
fa80: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
fa90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
faa0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
fab0: 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
fac0: 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
fad0: 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
fae0: 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
faf0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
fb00: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
fb10: 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
fb20: 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
fb30: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
fb40: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
fb50: 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
fb60: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
fb70: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
fb80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fb90: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
fba0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
fbb0: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
fbc0: 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
fbd0: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
fbe0: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
fbf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fc00: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
fc10: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
fc20: 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
fc30: 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
fc40: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
fc50: 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
fc60: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
fc70: 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
fc80: 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
fc90: 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
fca0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
fcb0: 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
fcc0: 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
fcd0: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
fce0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
fcf0: 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
fd00: 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
fd10: 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
fd20: 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
fd30: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
fd40: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
fd50: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
fd60: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
fd70: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
fd80: 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
fd90: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73 73   & 0xff;.    ass
fda0: 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
fdb0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
fdc0: 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72 72   );  /* This err
fdd0: 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69  or no longer exi
fde0: 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70 65  sts */.    isSpe
fdf0: 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
fe00: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
fe10: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
fe20: 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
fe30: 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
fe40: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
fe50: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
fe60: 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
fe70: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
fe80: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fe90: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
fea0: 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
feb0: 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
fec0: 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
fed0: 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
fee0: 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
fef0: 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
ff00: 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
ff10: 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
ff20: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
ff30: 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
ff40: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
ff50: 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
ff60: 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
ff70: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
ff80: 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
ff90: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
ffa0: 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
ffb0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
ffc0: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
ffd0: 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
ffe0: 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
fff0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
10000 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
10010 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 69 6c 65  ** occured while
10020 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
10030 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
10040 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
10050 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
10060 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
10070 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
10080 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
10090 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
100a0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
100b0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
100c0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
100d0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
100e0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
100f0 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
10100 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
10110 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
10120 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
10130 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
10140 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
10150 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
10160 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
10170 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
10180 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
10190 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
101a0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
101b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
101c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
101d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
101e0 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
101f0 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
10200 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
10210 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
10220 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
10230 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
10240 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
10250 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
10260 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
10270 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10280 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
10290 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
102a0 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
102b0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
102c0 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
102d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
102e0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
102f0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
10300 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
10310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10320 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10330 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
10340 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
10350 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
10360 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10380 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
10390 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
103a0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
103b0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
103c0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
103d0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
103e0 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
103f0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
10400 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
10410 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
10420 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
10430 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
10440 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
10450 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
10460 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
10470 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
10480 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
10490 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
104a0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
104b0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
104c0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
104d0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
104e0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
104f0 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d  b->writeVdbeCnt=
10500 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  =(p->readOnly==0
10510 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
10520 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10530 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f  E_OK || (p->erro
10540 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
10550 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72   && !isSpecialEr
10560 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ror) ){.        
10570 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
10580 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20  CheckFk(p, 1);. 
10590 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
105a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
105b0 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28        if( NEVER(
105c0 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  p->readOnly) ){.
105d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
105e0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
105f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
10600 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10610 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10620 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10630 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
10640 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
10650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10660 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
10670 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
10680 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
10690 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
106a0 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
106b0 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
106c0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
106d0 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
106e0 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
106f0 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
10700 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
10710 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
10720 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
10730 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
10740 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
10750 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
10760 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
10770 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
10780 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
10790 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
107a0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
107b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
107c0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
107d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
107e0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
107f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
10800 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10810 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
10820 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
10830 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
10840 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
10850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10860 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
10870 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
10880 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
10890 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
108a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
108b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
108c0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
108d0 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
108e0 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61  }.      db->nSta
108f0 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
10900 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
10910 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  mentOp==0 ){.   
10920 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10930 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
10940 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
10950 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  il ){.        eS
10960 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
10970 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a  EPOINT_RELEASE;.
10980 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10990 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
109a0 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
109b0 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
109c0 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
109d0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  LBACK;.      }el
109e0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61  se{.        inva
109f0 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
10a00 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
10a10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10a20 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
10a30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10a40 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
10a50 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
10a60 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
10a70 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
10a80 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
10a90 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
10aa0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
10ab0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10ac0 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
10ad0 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
10ae0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
10af0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
10b00 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
10b10 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
10b20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
10b30 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
10b40 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
10b50 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
10b60 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
10b70 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
10b80 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
10b90 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d  RAINT, then prom
10ba0 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ote the.    ** c
10bb0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
10bc0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
10bd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
10be0 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
10bf0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
10c00 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69   can only fail i
10c10 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 0a 20  f eStatementOp. 
10c20 20 20 20 2a 2a 20 69 73 20 53 41 56 45 50 4f 49     ** is SAVEPOI
10c30 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 42 75  NT_ROLLBACK.  Bu
10c40 74 20 69 66 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  t if p->rc==SQLI
10c50 54 45 5f 4f 4b 20 74 68 65 6e 20 65 53 74 61 74  TE_OK then eStat
10c60 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20 6d  ementOp.    ** m
10c70 75 73 74 20 62 65 20 53 41 56 45 50 4f 49 4e 54  ust be SAVEPOINT
10c80 5f 52 45 4c 45 41 53 45 2e 20 20 48 65 6e 63 65  _RELEASE.  Hence
10c90 20 74 68 65 20 4e 45 56 45 52 28 70 2d 3e 72 63   the NEVER(p->rc
10ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 69 6e 20  ==SQLITE_OK) in 
10cb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
10cc0 6f 77 69 6e 67 20 63 6f 64 65 2e 0a 20 20 20 20  owing code..    
10cd0 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
10ce0 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
10cf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
10d00 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
10d10 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
10d20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
10d30 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
10d40 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
10d50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10d60 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  CK );.        if
10d70 28 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53  ( NEVER(p->rc==S
10d80 51 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20 70 2d 3e  QLITE_OK) || p->
10d90 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
10da0 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
10db0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
10dc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10dd0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
10de0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
10df0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
10e00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10e10 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
10e20 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
10e30 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
10e40 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
10e50 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
10e60 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
10e70 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
10e80 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
10e90 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
10ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
10eb0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
10ec0 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
10ed0 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
10ee0 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
10ef0 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
10f00 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
10f10 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
10f20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10f30 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
10f40 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
10f50 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
10f60 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
10f70 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
10f80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10f90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10fa0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
10fb0 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
10fc0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10fe0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
10ff0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
11000 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
11010 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
11020 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20   /* Rollback or 
11030 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d  commit any schem
11040 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f  a changes that o
11050 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20  ccurred. */.    
11060 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
11070 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67  E_OK && db->flag
11080 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
11090 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20  hanges ){.      
110a0 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
110b0 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d  rnalSchema(db, -
110c0 31 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  1);.      db->fl
110d0 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ags = (db->flags
110e0 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   | SQLITE_Intern
110f0 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a  Changes);.    }.
11100 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
11110 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
11120 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
11130 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
11140 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
11150 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
11160 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
11170 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
11180 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
11190 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
111a0 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
111b0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
111c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62  Only ){.      db
111d0 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d  ->writeVdbeCnt--
111e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
111f0 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
11200 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65  beCnt>=db->write
11210 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20  VdbeCnt );.  }. 
11220 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
11230 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
11240 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
11250 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
11260 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11270 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
11280 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11290 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
112a0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
112b0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
112c0 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74  then any locks t
112d0 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20  hat were held.  
112e0 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** by connection
112f0 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65   db have now bee
11300 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c  n released. Call
11310 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
11320 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20  onUnlocked() .  
11330 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79  ** to invoke any
11340 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b   required unlock
11350 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
11360 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
11370 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
11380 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
11390 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62  ctionUnlocked(db
113a0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
113b0 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
113c0 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  Cnt>0 || db->aut
113d0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
113e0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
113f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
11400 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
11410 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
11420 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
11430 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
11440 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
11450 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
11460 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
11470 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
11480 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
11490 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
114a0 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
114b0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
114c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
114d0 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
114e0 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
114f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11500 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
11510 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
11520 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
11530 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
11540 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
11550 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
11560 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
11570 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
11580 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
11590 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
115a0 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
115b0 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
115c0 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
115d0 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
115e0 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
115f0 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
11600 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
11610 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
11620 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
11630 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
11640 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
11650 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
11660 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
11670 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
11680 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
11690 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
116a0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
116b0 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
116c0 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
116d0 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
116e0 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
116f0 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
11700 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
11710 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
11720 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
11730 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
11740 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
11750 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
11760 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
11770 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
11780 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
11790 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
117a0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
117b0 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
117c0 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
117d0 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
117e0 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
117f0 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
11800 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
11810 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
11820 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
11830 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
11840 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
11850 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
11860 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
11870 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
11880 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
11890 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
118a0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69  ->pc>=0 ){.    i
118b0 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  f( p->zErrMsg ){
118c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
118d0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
118e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
118f0 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
11900 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d  pErr,-1,p->zErrM
11910 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53  sg,SQLITE_UTF8,S
11920 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
11930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11940 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
11950 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43  ;.      db->errC
11960 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20  ode = p->rc;.   
11970 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11980 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
11990 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d  ;.      p->zErrM
119a0 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  sg = 0;.    }els
119b0 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20  e if( p->rc ){. 
119c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
119d0 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
119e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
119f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11a00 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
11a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11a20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29  p->runOnlyOnce )
11a30 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
11a40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
11a50 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
11a60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
11a70 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
11a80 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
11a90 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
11aa0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
11ab0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
11ac0 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
11ad0 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
11ae0 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
11af0 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
11b00 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
11b10 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
11b20 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
11b30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11b40 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
11b50 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
11b60 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
11b70 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
11b80 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
11b90 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11ba0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11bb0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
11bc0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
11bd0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
11be0 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
11bf0 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
11c00 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
11c10 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
11c20 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
11c30 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
11c40 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
11c50 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
11c60 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
11c70 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
11c80 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
11c90 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
11ca0 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
11cb0 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
11cc0 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
11cd0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
11ce0 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
11cf0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
11d00 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
11d10 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
11d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
11d30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
11d40 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
11d50 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
11d60 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
11d70 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
11d80 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
11d90 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
11da0 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
11db0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
11dc0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
11dd0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
11de0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
11df0 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
11e00 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
11e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11e20 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
11e30 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
11e40 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
11e50 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
11e60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
11e70 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
11e80 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e  C_INIT;.  return
11e90 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
11ea0 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
11eb0 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
11ec0 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
11ed0 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
11ee0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
11ef0 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
11f00 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
11f10 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
11f20 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
11f30 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
11f40 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
11f50 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
11f60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11f70 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
11f80 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
11f90 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
11fa0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
11fb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11fc0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
11fd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
11fe0 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
11ff0 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20  sk)==rc );.  }. 
12000 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12010 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
12020 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  rc;.}../*.** Cal
12030 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  l the destructor
12040 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74   for each auxdat
12050 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65  a entry in pVdbe
12060 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a  Func for which.*
12070 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
12080 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20  ing bit in mask 
12090 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61  is clear.  Auxda
120a0 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e  ta entries beyon
120b0 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61  d 31.** are alwa
120c0 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54  ys destroyed.  T
120d0 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75  o destroy all au
120e0 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63  xdata entries, c
120f0 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  all this.** rout
12100 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30  ine with mask==0
12110 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12120 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
12130 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64  ta(VdbeFunc *pVd
12140 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b  beFunc, int mask
12150 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
12160 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75  r(i=0; i<pVdbeFu
12170 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a  nc->nAux; i++){.
12180 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61      struct AuxDa
12190 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62  ta *pAux = &pVdb
121a0 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b  eFunc->apAux[i];
121b0 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c  .    if( (i>31 |
121c0 7c 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32 29  | !(mask&(((u32)
121d0 31 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78  1)<<i))) && pAux
121e0 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20  ->pAux ){.      
121f0 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
12200 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
12210 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
12220 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
12230 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78        pAux->pAux
12240 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12250 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
12260 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
12270 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
12280 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
12290 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
122a0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
122b0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
122c0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
122d0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
122e0 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
122f0 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
12300 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
12310 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
12320 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
12330 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
12340 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
12350 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
12360 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28  dbeDeleteObject(
12370 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
12380 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
12390 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
123a0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  t;.  assert( p->
123b0 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
123c0 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
123d0 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
123e0 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
123f0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
12400 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
12410 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
12420 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70  N);.  for(pSub=p
12430 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62  ->pProgram; pSub
12440 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20  ; pSub=pNext){. 
12450 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d     pNext = pSub-
12460 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65  >pNext;.    vdbe
12470 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
12480 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d  pSub->aOp, pSub-
12490 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  >nOp);.    sqlit
124a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
124b0 62 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72  b);.  }.  vdbeFr
124c0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d  eeOpArray(db, p-
124d0 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  >aOp, p->nOp);. 
124e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
124f0 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  b, p->aLabel);. 
12500 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12510 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
12520 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12530 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  (db, p->zSql);. 
12540 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12550 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20  b, p->pFree);.  
12560 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12570 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
12580 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
12590 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
125a0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
125b0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
125c0 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
125d0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
125e0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
125f0 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  db;.  if( p->pPr
12600 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
12610 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
12620 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
12630 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
12640 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
12650 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
12660 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
12670 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
12680 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
12690 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
126a0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
126b0 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
126c0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
126d0 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a  te3VdbeDeleteObj
126e0 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ect(db, p);.}../
126f0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
12700 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
12710 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
12720 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
12730 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
12740 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
12750 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
12760 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
12770 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
12780 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
12790 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
127a0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
127b0 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
127c0 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
127d0 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
127e0 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
127f0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
12800 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
12810 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
12820 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
12830 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
12840 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
12850 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
12860 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
12870 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
12880 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
12890 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
128a0 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
128b0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
128c0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
128d0 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
128e0 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
128f0 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
12900 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
12910 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
12920 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
12930 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12940 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
12950 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
12960 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
12970 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
12980 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
12990 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b      int res, rc;
129a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
129b0 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69  EST.    extern i
129c0 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
129d0 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a  h_count;.#endif.
129e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
129f0 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63  sTable );.    rc
12a00 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
12a10 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
12a20 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
12a30 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
12a40 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
12a50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12a60 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64      p->lastRowid
12a70 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67   = p->movetoTarg
12a80 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21  et;.    if( res!
12a90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
12aa0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12ab0 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56  .    p->rowidIsV
12ac0 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66  alid = 1;.#ifdef
12ad0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
12ae0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
12af0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
12b00 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d      p->deferredM
12b10 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
12b20 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
12b30 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
12b40 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
12b50 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
12b60 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b     int hasMoved;
12b70 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
12b80 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
12b90 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
12ba0 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b  sor, &hasMoved);
12bb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
12bc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
12bd0 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20   hasMoved ){.   
12be0 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
12bf0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
12c00 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f  .      p->nullRo
12c10 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 1;.    }.  }
12c20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12c30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
12c40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
12c50 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
12c60 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
12c70 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
12c80 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
12c90 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
12ca0 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
12cb0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12cc0 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
12cd0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
12ce0 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
12cf0 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
12d00 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
12d10 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
12d20 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
12d30 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
12d40 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
12d50 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
12d60 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
12d70 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
12d80 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
12d90 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
12da0 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
12db0 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
12dc0 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
12dd0 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
12de0 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
12df0 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
12e00 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
12e10 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
12e20 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
12e30 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
12e40 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
12e50 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
12e60 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
12e70 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
12e80 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
12e90 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
12ea0 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
12eb0 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
12ec0 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
12ed0 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
12ee0 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
12ef0 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
12f00 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
12f10 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
12f20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
12f30 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
12f40 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
12f50 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
12f60 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
12f70 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
12f80 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
12f90 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
12fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
12fc0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
12fd0 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
13000 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13020 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
13030 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
13040 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
13050 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
13060 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
13070 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
130a0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
130b0 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
130d0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
130e0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
130f0 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
13100 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
13110 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
13120 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13140 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
13150 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13160 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
13180 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
13190 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
131c0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
131d0 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131f0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
13200 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
13210 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13230 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
13240 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
13250 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
13260 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
13270 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
13280 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
13290 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
132a0 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
132b0 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
132c0 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
132d0 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
132e0 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
132f0 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
13300 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
13310 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
13320 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
13330 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
13340 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
13350 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
13360 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
13370 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
13380 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
13390 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
133a0 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69  ile_format){.  i
133b0 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
133c0 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b  >flags;.  int n;
133d0 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
133e0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
133f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
13400 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
13410 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
13420 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
13430 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
13440 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
13450 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
13460 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
13470 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
13480 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
13490 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
134a0 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f  .    if( file_fo
134b0 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29  rmat>=4 && (i&1)
134c0 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==i ){.      ret
134d0 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20  urn 8+(u32)i;.  
134e0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30 20    }.    if( i<0 
134f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28  ){.      if( i<(
13500 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65  -MAX_6BYTE) ) re
13510 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a  turn 6;.      /*
13520 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70   Previous test p
13530 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28  revents:  u = -(
13540 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
13550 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75  5808) */.      u
13560 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65   = -i;.    }else
13570 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20  {.      u = i;. 
13580 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
13590 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  127 ) return 1;.
135a0 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
135b0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
135c0 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
135d0 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
135e0 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
135f0 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
13600 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
13610 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
13620 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
13630 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
13640 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
13650 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
13660 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
13670 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
13680 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
13690 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
136a0 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
136b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
136c0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
136d0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
136e0 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
136f0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
13700 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
13710 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
13720 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13730 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
13740 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
13750 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
13760 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
13770 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
13780 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
13790 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
137a0 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
137b0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
137c0 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
137d0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
137e0 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
137f0 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
13800 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
13810 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
13820 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
13830 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
13840 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
13850 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
13860 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
13870 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
13880 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
13890 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
138a0 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
138b0 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
138c0 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
138d0 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
138e0 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
138f0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
13900 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
13910 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
13920 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
13930 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
13940 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
13950 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
13960 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
13970 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
13980 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
13990 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
139a0 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
139b0 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
139c0 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
139d0 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
139e0 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
139f0 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
13a00 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
13a10 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
13a20 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
13a30 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
13a40 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
13a50 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
13a60 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
13a70 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
13a80 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
13a90 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
13aa0 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
13ab0 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
13ac0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
13ad0 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
13ae0 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
13af0 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
13b00 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
13b10 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
13b20 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
13b30 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
13b40 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
13b50 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
13b60 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
13b70 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
13b80 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
13b90 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
13ba0 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
13bb0 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
13bc0 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
13bd0 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
13be0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
13bf0 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
13c00 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
13c10 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
13c20 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
13c30 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
13c40 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
13c50 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
13c60 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
13c70 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
13c80 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
13c90 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
13ca0 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
13cb0 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
13cc0 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
13cd0 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
13ce0 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
13cf0 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
13d00 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
13d10 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
13d20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
13d30 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
13d40 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
13d50 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
13d60 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
13d70 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
13d80 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
13d90 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
13da0 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
13db0 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
13dc0 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
13dd0 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
13de0 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
13df0 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
13e00 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
13e10 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
13e20 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
13e30 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
13e40 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
13e50 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
13e60 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
13e70 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
13e80 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
13e90 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
13ea0 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
13eb0 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
13ec0 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
13ed0 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
13ee0 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
13ef0 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
13f00 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
13f10 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
13f20 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
13f30 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
13f40 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
13f50 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
13f60 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
13f70 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
13f80 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
13f90 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
13fa0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
13fb0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
13fc0 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
13fd0 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
13fe0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
13ff0 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
14000 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
14010 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
14020 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
14030 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
14040 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
14050 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
14060 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
14070 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
14080 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
14090 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
140a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
140b0 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
140c0 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
140d0 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
140e0 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
140f0 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
14100 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
14110 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
14120 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
14130 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
14140 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
14150 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
14160 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
14170 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
14180 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
14190 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
141a0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
141b0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
141c0 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
141d0 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
141e0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
141f0 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
14200 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
14210 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
14220 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
14230 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
14240 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
14250 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
14260 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
14270 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
14280 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
14290 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
142a0 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
142b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
142c0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
142d0 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
142e0 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
142f0 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
14300 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
14310 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
14320 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
14330 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
14340 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
14350 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
14360 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
14370 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
14380 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
14390 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
143a0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
143b0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
143c0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
143d0 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
143e0 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
143f0 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
14400 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
14410 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
14420 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
14430 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
14440 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
14450 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
14460 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
14470 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14480 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
14490 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  ->r) );.      me
144a0 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
144b0 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
144c0 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
144d0 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
144e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
144f0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
14500 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
14510 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14520 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
14530 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
14540 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e  ert( len<=(u32)n
14550 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
14560 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
14570 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30  uf[i] = (u8)(v&0
14580 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
14590 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
145a0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
145b0 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
145c0 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
145d0 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
145e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
145f0 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
14600 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
14610 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
14620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
14630 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
14640 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
14650 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
14660 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
14670 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
14680 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
14690 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
146a0 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
146b0 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
146c0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
146d0 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
146e0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  m->u.nZero;.    
146f0 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d    assert( nBuf>=
14700 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  0 );.      if( l
14710 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29  en > (u32)nBuf )
14720 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
14730 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20  (u32)nBuf;.     
14740 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
14750 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
14760 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
14770 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14780 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
14790 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
147a0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
147b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
147c0 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
147d0 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
147e0 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
147f0 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
14800 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
14810 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
14820 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
14830 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14840 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75  ytes read..*/ .u
14850 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
14860 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
14870 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14880 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
14890 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
148a0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
148b0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
148c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
148d0 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
148e0 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
148f0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
14900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
14910 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
14920 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
14930 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
14940 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
14950 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
14960 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
14970 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
14980 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
14990 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
149a0 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
149b0 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
149c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
149d0 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
149e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
149f0 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
14a00 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
14a10 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
14a20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
14a30 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
14a40 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
14a50 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
14a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
14a70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
14a80 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
14a90 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
14aa0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
14ab0 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
14ac0 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
14ad0 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
14ae0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
14af0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
14b00 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
14b10 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
14b20 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
14b30 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
14b40 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
14b50 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
14b60 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
14b70 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
14b80 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14b90 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
14ba0 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
14bb0 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
14bc0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14bd0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
14be0 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
14bf0 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
14c00 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
14c10 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
14c20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14c30 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
14c40 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
14c50 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
14c60 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
14c70 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
14c80 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
14c90 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
14ca0 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
14cb0 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
14cc0 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
14cd0 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
14ce0 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
14cf0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
14d00 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
14d10 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
14d20 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
14d30 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
14d40 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
14d50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
14d60 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
14d70 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
14d80 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
14d90 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
14da0 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
14db0 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
14dc0 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
14dd0 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
14de0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
14df0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
14e00 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
14e10 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
14e20 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
14e30 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
14e40 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
14e50 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
14e60 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
14e70 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
14e80 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
14e90 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
14ea0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
14eb0 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
14ec0 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
14ed0 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
14ee0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
14ef0 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
14f00 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
14f10 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
14f20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
14f30 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
14f40 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
14f50 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
14f60 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
14f70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
14f80 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
14f90 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
14fa0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
14fb0 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
14fc0 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
14fd0 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
14fe0 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
14ff0 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
15000 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
15010 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
15020 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
15030 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
15040 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
15050 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
15060 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
15070 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
15080 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
15090 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
150a0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
150b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
150c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
150d0 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
150e0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
150f0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
15100 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15110 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
15120 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
15130 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
15140 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15150 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
15160 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
15170 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
15180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15190 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
151a0 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
151b0 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
151c0 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
151d0 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
151e0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
151f0 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
15200 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15210 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15220 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
15230 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
15240 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20        u32 len = 
15250 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
15260 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
15270 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
15280 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
15290 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
152a0 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
152b0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
152c0 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
152d0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
152e0 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
152f0 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
15300 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
15310 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
15320 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
15330 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
15340 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
15350 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15360 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
15370 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
15380 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
15390 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73   in pKey[], pars
153a0 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  e the.** record 
153b0 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52  into a UnpackedR
153c0 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e  ecord structure.
153d0 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
153e0 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74  er to.** that st
153f0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
15400 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
15410 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64  ion might provid
15420 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20  e szSpace bytes 
15430 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  of memory.** spa
15440 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54  ce at pSpace.  T
15450 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65  his space can be
15460 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
15470 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44  e returned.** VD
15480 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73  beParsedRecord s
15490 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69  tructure if it i
154a0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20  s large enough. 
154b0 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74   If it is.** not
154c0 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61   big enough, spa
154d0 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ce is obtained f
154e0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
154f0 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oc()..**.** The 
15500 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75  returned structu
15510 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  re should be clo
15520 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
15530 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44  .** sqlite3VdbeD
15540 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
15550 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63  ord()..*/ .Unpac
15560 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
15570 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
15580 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
15590 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
155a0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
155b0 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
155c0 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
155d0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
155e0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
155f0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
15600 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
15610 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
15620 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
15630 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
15640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
15650 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
15660 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74  ilable to hold t
15670 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  he object */.  i
15680 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20  nt szSpace      
15690 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
156a0 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
156b0 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
156c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
156d0 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
156e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
156f0 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
15700 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65  cord *p;  /* The
15710 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
15720 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65   that we will re
15730 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  turn */.  int nB
15740 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  yte;          /*
15750 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65   Memory space ne
15760 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20  eded to hold p, 
15770 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
15780 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  t d;.  u32 idx;.
15790 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
157a0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
157b0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
157c0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
157d0 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e   Mem *pMem;.  in
157e0 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t nOff;         
157f0 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53    /* Increase pS
15800 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75 63  pace by this muc
15810 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67  h to 8-byte alig
15820 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a  n it */.  .  /*.
15830 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20    ** We want to 
15840 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65  shift the pointe
15850 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68  r pSpace up such
15860 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79   that it is 8-by
15870 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a  te aligned..  **
15880 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74   Thus, we need t
15890 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61  o calculate a va
158a0 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65  lue, nOff, betwe
158b0 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73  en 0 and 7, to s
158c0 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79  hift .  ** it by
158d0 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20  .  If pSpace is 
158e0 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61  already 8-byte a
158f0 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f  ligned, nOff sho
15900 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a  uld be zero..  *
15910 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20  /.  nOff = (8 - 
15920 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
15930 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29  NT(pSpace) & 7))
15940 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b   & 7;.  pSpace +
15950 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63  = nOff;.  szSpac
15960 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79  e -= nOff;.  nBy
15970 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
15980 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
15990 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
159a0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
159b0 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
159c0 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20  yte>szSpace ){. 
159d0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
159e0 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
159f0 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
15a00 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
15a10 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e  eturn 0;.    p->
15a20 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
15a30 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50  _NEED_FREE | UNP
15a40 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
15a50 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OY;.  }else{.   
15a60 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
15a70 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20  cord*)pSpace;.  
15a80 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50    p->flags = UNP
15a90 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
15aa0 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65  OY;.  }.  p->pKe
15ab0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
15ac0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
15ad0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
15ae0 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20   + 1;.  p->aMem 
15af0 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  = pMem = (Mem*)&
15b00 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
15b10 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
15b20 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
15b30 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
15b40 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
15b50 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
15b60 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
15b70 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
15b80 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
15b90 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
15ba0 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26  & u<p->nField &&
15bb0 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
15bc0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
15bd0 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
15be0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
15bf0 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
15c00 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
15c10 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
15c20 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
15c30 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
15c40 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15c50 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d   0;.    pMem->zM
15c60 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64  alloc = 0;.    d
15c70 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
15c80 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64  erialGet(&aKey[d
15c90 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
15ca0 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b  pMem);.    pMem+
15cb0 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a  +;.    u++;.  }.
15cc0 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
15cd0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
15ce0 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
15cf0 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28   = u;.  return (
15d00 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  void*)p;.}../*.*
15d10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
15d20 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b  estroys a Unpack
15d30 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e  edRecord object.
15d40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15d50 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
15d60 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65  edRecord(Unpacke
15d70 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69  dRecord *p){.  i
15d80 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  nt i;.  Mem *pMe
15d90 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  m;..  assert( p!
15da0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15db0 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  p->flags & UNPAC
15dc0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
15dd0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
15de0 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70  Mem=p->aMem; i<p
15df0 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70  ->nField; i++, p
15e00 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54  Mem++){.    /* T
15e10 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
15e20 72 64 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e  rd is always con
15e30 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 0a  structed by the.
15e40 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
15e50 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
15e60 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c   function above,
15e70 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c   which makes all
15e80 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  .    ** strings 
15e90 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63  and blobs static
15ea0 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  .  And none of t
15eb0 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a  he elements are.
15ec0 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e      ** ever tran
15ed0 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72  sformed, so ther
15ee0 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68  e is never anyth
15ef0 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20  ing to delete.. 
15f00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
15f10 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  VER(pMem->zMallo
15f20 63 29 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  c) ) sqlite3Vdbe
15f30 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
15f40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66  ;.  }.  if( p->f
15f50 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
15f60 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20  NEED_FREE ){.   
15f70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
15f80 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
15f90 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
15fa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
15fb0 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
15fc0 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
15fd0 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
15fe0 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
15ff0 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
16000 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
16010 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
16020 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
16030 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
16040 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
16050 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
16060 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
16070 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
16080 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
16090 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
160a0 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d  eated by th OP_M
160b0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
160c0 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
160d0 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
160e0 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
160f0 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
16100 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
16110 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
16120 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  ecord..**.** Key
16130 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
16140 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
16150 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
16160 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20  r of fields..** 
16170 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65 77  The key with few
16180 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73 75  er fields is usu
16190 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65  ally compares le
161a0 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20  ss than the .** 
161b0 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77  longer key.  How
161c0 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50 41  ever if the UNPA
161d0 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61  CKED_INCRKEY fla
161e0 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20  gs in pPKey2 is 
161f0 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  set.** and the c
16200 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61  ommon prefixes a
16210 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b  re equal, then k
16220 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
16230 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20   key2..** Or if 
16240 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54  the UNPACKED_MAT
16250 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69  CH_PREFIX flag i
16260 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70 72  s set and the pr
16270 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71  efixes are.** eq
16280 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65  ual, then the ke
16290 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ys are considere
162a0 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e  d to be equal an
162b0 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62  d.** the parts b
162c0 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  eyond the common
162d0 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f   prefix are igno
162e0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
162f0 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  e UNPACKED_IGNOR
16300 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20  E_ROWID flag is 
16310 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  set, then the la
16320 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
16330 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79  e header of pKey
16340 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49  1 is ignored.  I
16350 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
16360 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e  t pKey1 is.** an
16370 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20   index key, and 
16380 74 68 75 73 20 65 6e 64 73 20 77 69 74 68 20 61  thus ends with a
16390 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54   rowid value.  T
163a0 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20  he last byte.** 
163b0 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 77 69  of the header wi
163c0 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
163d0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
163e0 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a  of the rowid:.**
163f0 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c   one of 1, 2, 3,
16400 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20   4, 5, 6, 8, or 
16410 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20  9 - the integer 
16420 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a  serial types..**
16430 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
16440 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   of the final ro
16450 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  wid will always 
16460 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  be a single byte
16470 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67  ..** By ignoring
16480 20 74 68 69 73 20 6c 61 73 74 20 62 79 74 65 20   this last byte 
16490 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c 20 77  of the header, w
164a0 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70  e force the comp
164b0 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e  arison.** to ign
164c0 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20 61 74  ore the rowid at
164d0 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31   the end of key1
164e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
164f0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
16500 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
16510 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
16520 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
16530 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
16540 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
16550 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
16560 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20  /.){.  int d1;  
16570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
16580 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
16590 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
165a0 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
165b0 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
165c0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
165d0 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
165e0 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
165f0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
16600 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
16610 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
16620 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
16630 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69   int nField;.  i
16640 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
16650 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16660 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
16670 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16680 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
16690 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
166a0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
166b0 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
166c0 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e  KeyInfo;.  mem1.
166d0 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
166e0 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
166f0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
16700 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
16710 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
16720 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
16730 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16740 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
16750 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  NLY( mem1.zMallo
16760 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
16770 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
16780 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
16790 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
167a0 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
167b0 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
167c0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
167d0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
167e0 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
167f0 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
16800 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
16810 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
16820 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
16830 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
16840 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
16850 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
16860 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
16870 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
16880 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
16890 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
168a0 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
168b0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
168c0 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
168d0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
168e0 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
168f0 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
16900 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
16910 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
16920 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
16930 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
16940 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
16950 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
16960 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
16970 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
16980 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
16990 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
169a0 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
169b0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
169c0 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
169d0 20 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70   szHdr1;.  if( p
169e0 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
169f0 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
16a00 4f 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64  OWID ){.    szHd
16a10 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65  r1--;.  }.  nFie
16a20 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
16a30 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
16a40 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
16a50 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
16a60 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
16a70 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
16a80 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
16a90 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
16aa0 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
16ab0 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
16ac0 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
16ad0 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
16ae0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
16af0 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
16b00 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
16b10 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
16b20 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
16b30 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
16b40 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
16b50 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
16b60 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
16b70 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
16b80 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
16b90 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
16ba0 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
16bb0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
16bc0 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
16bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
16be0 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
16bf0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a  PKey2->aMem[i],.
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69             i<nFi
16c20 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld ? pKeyInfo->
16c30 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20  aColl[i] : 0);. 
16c40 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
16c50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
16c60 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
16c70 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
16c80 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20   below */..     
16c90 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
16ca0 65 73 75 6c 74 20 69 66 20 77 65 20 61 72 65 20  esult if we are 
16cb0 75 73 69 6e 67 20 44 45 53 43 20 73 6f 72 74 20  using DESC sort 
16cc0 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
16cd0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
16ce0 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 6e 46  ortOrder && i<nF
16cf0 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f  ield && pKeyInfo
16d00 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
16d10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16d20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
16d30 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
16d40 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20  e PREFIX_SEARCH 
16d50 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
16d60 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70  all fields excep
16d70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20  t the final.    
16d80 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64    ** rowid field
16d90 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65   were equal, the
16da0 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46  n clear the PREF
16db0 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61  IX_SEARCH flag a
16dc0 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a  nd set .      **
16dd0 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74   pPKey2->rowid t
16de0 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
16df0 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69  he rowid field i
16e00 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29  n (pKey1, nKey1)
16e10 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
16e20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f  is used by the O
16e30 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64  P_IsUnique opcod
16e40 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
16e50 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66    if( (pPKey2->f
16e60 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
16e70 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26  PREFIX_SEARCH) &
16e80 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46  & i==(pPKey2->nF
16e90 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20  ield-1) ){.     
16ea0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d     assert( idx1=
16eb0 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b  =szHdr1 && rc );
16ec0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16ed0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45   mem1.flags & ME
16ee0 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
16ef0 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
16f00 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46  = ~UNPACKED_PREF
16f10 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20  IX_SEARCH;.     
16f20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64     pPKey2->rowid
16f30 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20   = mem1.u.i;.   
16f40 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20     }.    .      
16f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16f60 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
16f70 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
16f80 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
16f90 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
16fa0 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
16fb0 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
16fc0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
16fd0 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
16fe0 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
16ff0 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
17000 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
17010 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
17020 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
17030 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
17040 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
17050 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
17060 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
17070 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
17080 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
17090 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
170a0 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
170b0 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
170c0 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
170d0 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
170e0 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73  KEY.  ** flag is
170f0 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b   set, then break
17100 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61   the tie by trea
17110 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72  ting key2 as lar
17120 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ger..  ** If the
17130 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f   UPACKED_PREFIX_
17140 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65  MATCH flag is se
17150 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74  t, then keys wit
17160 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  h common prefixe
17170 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69  s.  ** are consi
17180 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
17190 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  l.  Otherwise, t
171a0 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73  he longer key is
171b0 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65   the .  ** large
171c0 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e  r.  As it happen
171d0 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69  s, the pPKey2 wi
171e0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ll always be the
171f0 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20   longer.  ** if 
17200 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65  there is a diffe
17210 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  rence..  */.  as
17220 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
17230 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
17240 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs & UNPACKED_IN
17250 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20  CRKEY ){.    rc 
17260 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = -1;.  }else if
17270 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
17280 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
17290 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f  X_MATCH ){.    /
172a0 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f  * Leave rc==0 */
172b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78  .  }else if( idx
172c0 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20  1<szHdr1 ){.    
172d0 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  rc = 1;.  }.  re
172e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a  turn rc;.}. ../*
172f0 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
17300 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
17310 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
17320 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
17330 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
17340 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
17350 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
17360 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
17370 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
17380 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
17390 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
173a0 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
173b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
173c0 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
173d0 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
173e0 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
173f0 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
17400 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
17410 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
17420 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
17430 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
17440 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
17450 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
17460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17470 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
17480 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
17490 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
174a0 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
174b0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
174c0 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
174d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
174e0 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
174f0 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
17500 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
17510 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
17520 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
17530 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
17540 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
17550 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e   Mem m, v;..  UN
17560 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
17570 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  b);..  /* Get th
17580 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
17590 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
175a0 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
175b0 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
175c0 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
175d0 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
175e0 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
175f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
17600 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
17610 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
17620 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
17630 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
17640 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
17650 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
17660 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
17670 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
17680 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
17690 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
176a0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
176b0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
176c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
176d0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
176e0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
176f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17700 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
17710 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
17720 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
17730 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
17740 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
17750 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
17760 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
17770 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
17780 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
17790 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
177a0 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  entry */.  memse
177b0 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
177c0 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  m));.  rc = sqli
177d0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
177e0 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e  ree(pCur, 0, (in
177f0 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
17800 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
17810 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17820 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
17830 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
17840 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
17850 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
17860 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
17870 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
17880 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
17890 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
178a0 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
178b0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
178c0 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
178d0 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
178e0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
178f0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
17900 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
17910 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
17920 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
17930 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
17940 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
17950 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
17960 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
17970 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
17980 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
17990 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
179a0 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
179b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
179c0 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
179d0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
179e0 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
179f0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
17a00 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
17a10 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
17a20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
17a30 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
17a40 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17a50 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
17a60 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
17a70 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
17a80 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
17a90 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17aa0 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
17ab0 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
17ac0 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
17ad0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
17ae0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
17af0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
17b00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17b10 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
17b20 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
17b30 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
17b40 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
17b50 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
17b60 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
17b70 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
17b80 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
17b90 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
17ba0 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
17bb0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
17bc0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
17bd0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
17be0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
17bf0 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
17c00 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
17c10 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
17c20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
17c30 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
17c40 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
17c50 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
17c60 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
17c70 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
17c80 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
17c90 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
17ca0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
17cb0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
17cc0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
17cd0 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
17ce0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17cf0 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
17d00 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b   m.zMalloc!=0 );
17d10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
17d20 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
17d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17d40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
17d50 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
17d60 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
17d70 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
17d80 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
17d90 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
17da0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
17db0 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
17dc0 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
17dd0 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
17de0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
17df0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
17e00 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
17e10 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
17e20 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
17e30 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
17e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
17e50 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
17e60 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
17e70 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
17e80 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
17e90 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
17ea0 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
17eb0 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
17ec0 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
17ed0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
17ee0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
17ef0 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
17f00 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
17f10 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
17f20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
17f30 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
17f40 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
17f50 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
17f60 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
17f70 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
17f80 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
17f90 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f  are(.  VdbeCurso
17fa0 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
17fb0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
17fc0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
17fd0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
17fe0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
17ff0 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  ed,  /* Unpacked
18000 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
18010 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
18020 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  st */.  int *res
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
18050 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
18060 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
18070 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
18080 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
18090 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
180a0 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
180b0 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
180c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
180d0 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
180e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
180f0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
18100 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
18110 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
18120 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
18130 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
18140 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
18150 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
18160 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
18170 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
18180 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
18190 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
181a0 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68   the say.  ** th
181b0 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
181c0 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
181d0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
181e0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
181f0 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
18200 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
18210 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
18220 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
18230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18240 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
18250 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
18260 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72   sizeof(m));.  r
18270 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
18280 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
18290 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74  pCursor, 0, (int
182a0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
182b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
182c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
182d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70  }.  assert( pUnp
182e0 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55  acked->flags & U
182f0 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
18300 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d  OWID );.  *res =
18310 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18320 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
18330 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
18340 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18350 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
18360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18380 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
18390 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
183a0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
183b0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
183c0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
183d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
183e0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
183f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
18400 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
18410 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
18420 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
18430 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18440 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
18450 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
18460 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
18470 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
18480 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
18490 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
184a0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
184b0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
184c0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
184d0 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
184e0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
184f0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
18500 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
18510 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
18520 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
18530 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
18540 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18550 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18560 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
18570 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
18580 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
18590 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
185a0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
185b0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
185c0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
185d0 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
185e0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
185f0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
18600 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
18610 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
18620 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
18630 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
18640 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
18650 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
18660 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
18670 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
18680 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
18690 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
186a0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
186b0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
186c0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
186d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
186e0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
186f0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
18700 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
18710 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
18720 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
18730 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
18740 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
18750 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
18760 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
18770 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
18780 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
18790 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
187a0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
187b0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
187c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
187d0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
187e0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
187f0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
18800 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
18810 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
18820 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
18830 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
18840 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
18850 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
18860 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
18870 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
18880 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
18890 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
188a0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
188b0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
188c0 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
188d0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
188e0 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
188f0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
18900 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
18910 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
18920 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
18930 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
18940 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
18950 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
18960 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
18970 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
18980 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
18990 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
189a0 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
189b0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
189c0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
189d0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
189e0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
189f0 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
18a00 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
18a10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18a20 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
18a30 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
18a40 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
18a50 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
18a60 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
18a70 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73  UTF8);.        s
18a80 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f  qlite3VdbeMemSto
18a90 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52  reType((Mem *)pR
18aa0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
18ab0 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
18ac0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18ad0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
18ae0 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
18af0 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
18b00 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
18b10 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
18b20 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
18b30 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
18b40 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
18b50 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
18b60 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
18b70 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
18b80 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
18b90 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
18ba0 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
18bb0 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
18bc0 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
18bd0 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
18be0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
18bf0 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
18c00 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
18c10 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
18c20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
18c30 0a                                               .