/ Hex Artifact Content
Login

Artifact 0505dc4f7ff3cf35e219fe0a20ab798a42772b8b:


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: 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20  Rewind the VDBE 
a1e0: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
a1f0: 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61  nning in prepara
a200: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e  tion for.** runn
a210: 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ing it..*/.void 
a220: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
a230: 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20  d(Vdbe *p){.#if 
a240: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
a250: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
a260: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20  (VDBE_PROFILE). 
a270: 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20   int i;.#endif. 
a280: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
a290: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
a2a0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
a2b0: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
a2c0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
a2d0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
a2e0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
a2f0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
a300: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
a310: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
a320: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
a330: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
a340: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
a350: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
a360: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a370: 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  UG.  for(i=1; i<
a380: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
a390: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
a3a0: 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
a3b0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
a3c0: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
a3d0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
a3e0: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
a3f0: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
a400: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
a410: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
a420: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
a430: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
a440: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
a450: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
a460: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
a470: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
a480: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
a490: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
a4a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a4b0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
a4c0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
a4d0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
a4e0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
a4f0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
a500: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
a510: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
a520: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
a530: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
a540: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
a550: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a560: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
a570: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
a580: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
a590: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
a5a0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
a5b0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
a5c0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
a5d0: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
a5e0: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
a5f0: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
a600: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
a610: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
a620: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
a630: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
a640: 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63  called exact onc
a650: 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74  e on a each virt
a660: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
a670: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
a680: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
a690: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
a6a0: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
a6b0: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
a6c0: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
a6d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
a6e0: 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a  uther calls to .
a6f0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
a700: 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  dOp() functions 
a710: 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20  are prohibited. 
a720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69   This routine di
a730: 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65  sconnects.** the
a740: 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50   Vdbe from the P
a750: 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74  arse object that
a760: 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65   helped generate
a770: 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a   it so that the.
a780: 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f  ** the Vdbe beco
a790: 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65  mes an independe
a7a0: 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68  nt entity and th
a7b0: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63  e Parse object c
a7c0: 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79  an be.** destroy
a7d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ed..**.** Use th
a7e0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  e sqlite3VdbeRew
a7f0: 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20  ind() procedure 
a800: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72  to restore a vir
a810: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63  tual machine bac
a820: 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74  k.** to its init
a830: 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20  ial state after 
a840: 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e  it has been run.
a850: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a860: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
a870: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
a8a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20   Parse *pParse  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a8d0: 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  xt */.){.  sqlit
a8e0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
a8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a900: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
a910: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  tion */.  int nV
a920: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
a930: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a940: 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  er of parameters
a950: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20   */.  int nMem; 
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a980: 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69  f VM memory regi
a990: 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sters */.  int n
a9a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
a9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a9c0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72  ber of cursors r
a9d0: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
a9e0: 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
aa00: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
aa10: 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d  ts in subprogram
aa20: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
aa50: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  unter */.  u8 *z
aa60: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
aa70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
aa80: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
aa90: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
aaa0: 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20    u8 *zEnd;     
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
aad0: 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  ast allocated me
aae0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  mory */.  int nB
aaf0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
ab00: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
ab10: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
ab20: 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  y is needed */..
ab30: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
ab40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
ab50: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
ab60: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
ab70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
ab80: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
ab90: 49 54 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  IT );.  db = p->
aba0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
abb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
abc0: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
abd0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
abe0: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
abf0: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
ac00: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
ac10: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
ac20: 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 46  axArg;.  .  /* F
ac30: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
ac40: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
ac50: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
ac60: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
ac70: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
ac80: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
ac90: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
aca0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
acb0: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
acc0: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
acd0: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
ace0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
acf0: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
ad00: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
ad10: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
ad20: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
ad30: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
ad40: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
ad50: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
ad60: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
ad70: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
ad80: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
ad90: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
ada0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
adb0: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
adc0: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
add0: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
ade0: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
adf0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
ae00: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
ae10: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
ae20: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
ae30: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
ae40: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
ae50: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
ae60: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
ae70: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
ae80: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
ae90: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
aea0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
aeb0: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
aec0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e  ocation */.  zEn
aed0: 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70  d = (u8*)&p->aOp
aee0: 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20  [p->nOpAlloc];  
aef0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
af00: 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d  st end of zCsr[]
af10: 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   */..  resolveP2
af20: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
af30: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
af40: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
af50: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
af60: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
af70: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
af80: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
af90: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
afa0: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
afb0: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
afc0: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
afd0: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
afe0: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73  (u8*)0)&7;.  ass
aff0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
b000: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20  ALIGNMENT(zCsr) 
b010: 29 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  );..  /* Memory 
b020: 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
b030: 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
b040: 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
b050: 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a  ated in two.  **
b060: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
b070: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
b080: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
b090: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
b0a0: 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68   .  ** end of th
b0b0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
b0c0: 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
b0d0: 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c  e to satisfy all
b0e0: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71   memory.  ** req
b0f0: 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75  uirements by reu
b100: 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20  sing the opcode 
b110: 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e  array tail, then
b120: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
b130: 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20   pass will fill 
b140: 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e  in the rest usin
b150: 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61  g a fresh alloca
b160: 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  tion.  .  **.  *
b170: 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
b180: 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
b190: 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
b1a0: 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
b1b0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65  from.  ** the le
b1c0: 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20  ftover space at 
b1d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
b1e0: 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20  pcode array can 
b1f0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
b200: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
b210: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
b220: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
b230: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
b240: 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79  /.  do {.    nBy
b250: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  te = 0;.    p->a
b260: 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
b270: 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73  (p->aMem, nMem*s
b280: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
b290: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b2a0: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
b2b0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
b2c0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
b2d0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
b2e0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b2f0: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
b300: 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20  Space(p->apArg, 
b310: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
b320: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b330: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b340: 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  azVar = allocSpa
b350: 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61  ce(p->azVar, nVa
b360: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c  r*sizeof(char*),
b370: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b380: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Byte);.    p->ap
b390: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
b3a0: 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73  (p->apCsr, nCurs
b3b0: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
b3c0: 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20  rsor*),.        
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26    &zCsr, zEnd, &
b3f0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
b400: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70  nByte ){.      p
b410: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
b420: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
b430: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
b440: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
b450: 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ree;.    zEnd = 
b460: 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20  &zCsr[nByte];.  
b470: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26  }while( nByte &&
b480: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
b490: 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72  ed );..  p->nCur
b4a0: 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75 72 73  sor = (u16)nCurs
b4b0: 6f 72 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  or;.  if( p->aVa
b4c0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
b4d0: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
b4e0: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
b4f0: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
b500: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
b510: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
b520: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
b530: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
b540: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72  }.  if( p->azVar
b550: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
b560: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
b570: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
b580: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
b590: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
b5a0: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
b5b0: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
b5c0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
b5d0: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
b5e0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
b5f0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
b600: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
b610: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
b640: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
b650: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
b660: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
b670: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
b680: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
b690: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
b6a0: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
b6b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
b6c0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
b6d0: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ull;.      p->aM
b6e0: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
b6f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78     }.  }.  p->ex
b700: 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
b710: 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74  explain;.  sqlit
b720: 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
b730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
b740: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
b750: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
b760: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
b770: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
b780: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
b790: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b7a0: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
b7b0: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
b7c0: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
b7d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
b7e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
b7f0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
b800: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
b810: 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20  x->pBt);.    /* 
b820: 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  The pCx->pCursor
b830: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61   will be close a
b840: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66  utomatically, if
b850: 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20   it exists, by. 
b860: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
b870: 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65  bove. */.  }else
b880: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
b890: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b8a0: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
b8b0: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
b8c0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b8d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b8e0: 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e  ABLE.  if( pCx->
b8f0: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
b900: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
b910: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
b920: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
b930: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
b940: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
b950: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d   *pModule = pCx-
b960: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d  >pModule;.    p-
b970: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
b980: 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  1;.    pModule->
b990: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73  xClose(pVtabCurs
b9a0: 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  or);.    p->inVt
b9b0: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
b9c0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
b9d0: 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
b9e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
b9f0: 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74  VdbeFrame struct
ba00: 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e  ure to its Vdbe.
ba10: 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64   This.** is used
ba20: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
ba30: 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75  hen a trigger su
ba40: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c  b-program is hal
ba50: 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a  ted to restore.*
ba60: 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  * control to the
ba70: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a   main program..*
ba80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
ba90: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64  eFrameRestore(Vd
baa0: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
bab0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46  {.  Vdbe *v = pF
bac0: 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f  rame->v;.  v->aO
bad0: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
bae0: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
baf0: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
bb00: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
bb10: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
bb20: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
bb30: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
bb40: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
bb50: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
bb60: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
bb70: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
bb80: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
bb90: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
bba0: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
bbb0: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
bbc0: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
bbd0: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
bbe0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
bbf0: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
bc00: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
bc10: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
bc20: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
bc30: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
bc40: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
bc50: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
bc60: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
bc70: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
bc80: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
bc90: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
bca0: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
bcb0: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
bcc0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
bcd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
bce0: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
bcf0: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
bd00: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
bd10: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
bd20: 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
bd30: 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
bd40: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
bd50: 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
bd60: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
bd70: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
bd80: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20  e(pFrame);.  }. 
bd90: 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a   p->pFrame = 0;.
bda0: 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
bdb0: 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ..  if( p->apCsr
bdc0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
bdd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
bde0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
bdf0: 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72        VdbeCursor
be00: 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b   *pC = p->apCsr[
be10: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  i];.      if( pC
be20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
be30: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
be40: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
be50: 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
be60: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
be70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
be80: 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
be90: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
bea0: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  em[1], p->nMem);
beb0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
bec0: 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
bed0: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
bee0: 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
bef0: 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
bf00: 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
bf10: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
bf20: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
bf30: 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Del);.  }.}../*.
bf40: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
bf50: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
bf60: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
bf70: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
bf80: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
bf90: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
bfa0: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
bfb0: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
bfc0: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
bfd0: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
bfe0: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
bff0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
c000: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
c010: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
c020: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
c030: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
c040: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
c050: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
c060: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
c070: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
c080: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
c090: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
c0a0: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
c0b0: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
c0c0: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
c0d0: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
c0e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c0f0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
c100: 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
c110: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72 5b  ==0 || p->apCsr[
c120: 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  i]==0 );.  for(i
c130: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
c140: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
c150: 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d  aMem==0 || p->aM
c160: 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
c170: 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66 0a  _Null );.#endif.
c180: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
c190: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
c1a0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
c1b0: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
c1c0: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
c1d0: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
c1e0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
c1f0: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
c200: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
c210: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
c220: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
c230: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
c240: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
c250: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
c260: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
c270: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
c280: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
c290: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
c2a0: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
c2b0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
c2c0: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
c2d0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
c2e0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
c2f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
c300: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
c310: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
c320: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
c330: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
c340: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
c350: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
c360: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c370: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
c380: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
c390: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
c3a0: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
c3b0: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
c3c0: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
c3d0: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
c3e0: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
c3f0: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
c400: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
c410: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
c420: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
c430: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
c440: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
c450: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
c460: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
c470: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
c480: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
c490: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
c4a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
c4b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
c4c0: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
c4d0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
c4e0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
c4f0: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
c500: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
c510: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
c520: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
c530: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
c540: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
c550: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
c560: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
c570: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
c580: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
c590: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
c5a0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
c5b0: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
c5c0: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
c5d0: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
c5e0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
c5f0: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
c600: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
c610: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
c620: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
c630: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
c640: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
c650: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c660: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
c670: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
c6a0: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
c6b0: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
c6e0: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
c6f0: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
c700: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
c710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c720: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
c730: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
c740: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c750: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
c760: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
c770: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
c780: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
c790: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
c7a0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
c7b0: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
c7c0: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
c7d0: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
c7e0: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
c7f0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
c800: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
c810: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
c820: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
c830: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
c840: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
c850: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
c860: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
c870: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
c880: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c890: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
c8a0: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
c8b0: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
c8c0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
c8d0: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
c8e0: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
c8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
c900: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
c910: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
c920: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
c930: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
c940: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
c950: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
c960: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
c970: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c980: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
c990: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
c9a0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
c9b0: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
c9c0: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
c9d0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
c9e0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
c9f0: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
ca00: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
ca10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
ca20: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
ca30: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
ca40: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
ca50: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
ca60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ca70: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
ca80: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
ca90: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
caa0: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
cab0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
cac0: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
cad0: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
cae0: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
caf0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
cb00: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
cb10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
cb20: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
cb30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
cb40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
cb50: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
cb60: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
cb70: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
cb80: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
cb90: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
cba0: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
cbb0: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
cbc0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
cbd0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
cbe0: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
cbf0: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
cc00: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
cc10: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
cc20: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
cc30: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
cc40: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
cc50: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
cc60: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
cc70: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
cc80: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
cc90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
cca0: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
ccb0: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
ccc0: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
ccd0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
cce0: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
ccf0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
cd00: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
cd10: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26  e3VtabSync(db, &
cd20: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20  p->zErrMsg);..  
cd30: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
cd40: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
cd50: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
cd60: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
cd70: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
cd80: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
cd90: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
cda0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
cdb0: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
cdc0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
cdd0: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
cde0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
cdf0: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
ce00: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
ce10: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
ce20: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
ce30: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
ce40: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
ce50: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
ce60: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
ce70: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
ce80: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
ce90: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
cea0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
ceb0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
cec0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
ced0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
cee0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
cef0: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
cf00: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
cf10: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
cf20: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
cf30: 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
cf40: 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74  veLock(sqlite3Bt
cf50: 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a  reePager(pBt));.
cf60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
cf70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cf80: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
cf90: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
cfa0: 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
cfb0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
cfc0: 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
cfd0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
cfe0: 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
cff0: 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
d000: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
d010: 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
d020: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
d030: 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
d040: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
d050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
d060: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
d070: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
d080: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
d090: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
d0a0: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
d0b0: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
d0c0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
d0d0: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
d0e0: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
d0f0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
d100: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
d110: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
d120: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
d130: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
d140: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
d150: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
d160: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
d170: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
d180: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
d190: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
d1a0: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
d1b0: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
d1c0: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
d1d0: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
d1e0: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
d1f0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
d200: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
d210: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
d220: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
d230: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
d240: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
d250: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
d260: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
d270: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
d280: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
d290: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
d2a0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
d2b0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
d2c0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
d2d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d2e0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
d2f0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
d300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
d310: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
d320: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
d330: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
d340: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
d350: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
d360: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
d370: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
d380: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
d390: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
d3a0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
d3b0: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
d3c0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
d3d0: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
d3e0: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
d3f0: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
d400: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
d410: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
d420: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
d430: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
d440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d450: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
d460: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
d470: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
d480: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
d490: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
d4a0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
d4b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d4c0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
d4d0: 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
d4e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d4f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d500: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d510: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
d520: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
d530: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
d540: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
d550: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
d560: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
d570: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
d580: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
d590: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
d5a0: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
d5b0: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
d5c0: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
d5d0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
d5e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
d5f0: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
d600: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
d610: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
d620: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
d630: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
d640: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
d650: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
d660: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
d670: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
d680: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
d690: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
d6a0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
d6b0: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
d6c0: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
d6d0: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
d6e0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
d6f0: 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53  t res;..    /* S
d700: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
d710: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d720: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
d730: 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
d740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
d750: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
d760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d770: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
d780: 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
d790: 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61  ndom);.      zMa
d7a0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
d7b0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
d7c0: 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  %08X", zMainFile
d7d0: 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66  , iRandom&0x7fff
d7e0: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
d7f0: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
d800: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d810: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
d820: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  }.      sqlite3F
d830: 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
d840: 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
d850: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d860: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
d870: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
d880: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
d890: 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
d8a0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
d8b0: 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
d8c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d8d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
d8e0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
d8f0: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
d900: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
d910: 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
d920: 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
d930: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
d940: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
d950: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
d960: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
d970: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
d980: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
d990: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
d9a0: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
d9b0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
d9c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d9d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d9e0: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
d9f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
da00: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
da10: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
da20: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
da30: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
da40: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
da50: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
da60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
da70: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
da80: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
da90: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
daa0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
dab0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
dac0: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
dad0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
dae0: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
daf0: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
db00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
db10: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
db20: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
db30: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
db40: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
db50: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
db60: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
db70: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
db80: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
db90: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
dba0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
dbb0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
dbc0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
dbd0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
dbe0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
dbf0: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
dc00: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
dc10: 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
dc20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
dc30: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
dc40: 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
dc50: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
dc60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dc70: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
dc80: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
dc90: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
dca0: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
dcb0: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
dcc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
dcd0: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
dce0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
dcf0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
dd00: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
dd10: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
dd20: 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
dd30: 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
dd40: 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
dd50: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
dd60: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
dd70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
dd90: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
dda0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ddb0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
ddc0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
ddd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dde0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
ddf0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
de00: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
de10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
de20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
de30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
de40: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
de50: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
de60: 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
de70: 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
de80: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
de90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
dea0: 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26  needSync .     &
deb0: 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  & 0==(sqlite3OsD
dec0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
ded0: 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
dee0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
def0: 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
df00: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
df10: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
df20: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
df30: 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
df40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
df50: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
df60: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
df70: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
df80: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
df90: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
dfa0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
dfb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
dfc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
dfd0: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
dfe0: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
dff0: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
e000: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
e010: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
e020: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e030: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
e040: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
e050: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
e060: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
e070: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
e080: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
e090: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
e0a0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
e0b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
e0c0: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
e0d0: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
e0e0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e0f0: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
e100: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
e110: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
e120: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
e130: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
e140: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
e150: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
e160: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
e170: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e180: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
e190: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e1a0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
e1b0: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
e1c0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
e1d0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
e1e0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
e1f0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
e200: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
e210: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e220: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e230: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e240: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e250: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e260: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
e270: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
e280: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
e290: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
e2a0: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
e2b0: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e2c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e2d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e2e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e2f0: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e300: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e310: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
e320: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
e330: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
e340: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
e350: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
e360: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
e370: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
e380: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
e390: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
e3a0: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
e3b0: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
e3c0: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
e3d0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
e3e0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
e3f0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
e400: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e410: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
e420: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
e430: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
e440: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e450: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
e460: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
e470: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
e480: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
e490: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
e4a0: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
e4b0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
e4c0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
e4d0: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
e4e0: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
e4f0: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
e500: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
e510: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
e520: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
e530: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
e540: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
e550: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
e560: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
e570: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
e580: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
e590: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
e5a0: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
e5b0: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
e5c0: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
e5d0: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
e5e0: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
e5f0: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
e600: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
e610: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
e620: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
e630: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
e640: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
e650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
e660: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
e670: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
e680: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e690: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
e6a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e6b0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e6c0: 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
e6d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e6e0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
e6f0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
e700: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
e710: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
e720: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
e730: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
e740: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
e750: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
e760: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
e770: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
e780: 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63  .activeVdbeCnt c
e790: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
e7a0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
e7b0: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
e7c0: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
e7d0: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
e7e0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
e7f0: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
e800: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
e810: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
e820: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
e830: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
e840: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
e850: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
e860: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
e870: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
e880: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
e890: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
e8a0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
e8b0: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
e8c0: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
e8d0: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
e8e0: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
e8f0: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
e900: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
e910: 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
e920: 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
e930: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61  ){.    if( p->ma
e940: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
e950: 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  RUN && p->pc>=0 
e960: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
e970: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61        if( p->rea
e980: 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74  dOnly==0 ) nWrit
e990: 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  e++;.    }.    p
e9a0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
e9b0: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
e9c0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
e9d0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t );.  assert( n
e9e0: 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65  Write==db->write
e9f0: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
ea00: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
ea10: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
ea20: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
ea30: 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74  or every Btree t
ea40: 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  hat in database 
ea50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68  connection db wh
ea60: 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e  ich .** has been
ea70: 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70   modified, "trip
ea80: 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20  " or invalidate 
ea90: 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a  each cursor in.*
eaa0: 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67  * that Btree mig
eab0: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ht have been mod
eac0: 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68  ified so that th
ead0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
eae0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67  never be used ag
eaf0: 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65  ain.  This happe
eb00: 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ns when a rollba
eb10: 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ck.*** occurs.  
eb20: 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20  We have to trip 
eb30: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75  all the other cu
eb40: 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63  rsors, even.** c
eb50: 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72  ursor from other
eb60: 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e   VMs in differen
eb70: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
eb80: 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68  ctions,.** so th
eb90: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20  at none of them 
eba0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64  try to use the d
ebb0: 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65  ata at which the
ebc0: 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69  y.** were pointi
ebd0: 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77  ng and which now
ebe0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
ebf0: 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f  hanged due.** to
ec00: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
ec10: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
ec20: 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61  at a rollback ca
ec30: 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20  n delete tables 
ec40: 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20  complete and.** 
ec50: 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65  reorder rootpage
ec60: 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74  s.  So it is not
ec70: 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74   sufficient just
ec80: 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20   to save.** the 
ec90: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
eca0: 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  sor.  We have to
ecb0: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
ecc0: 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61  cursor.** so tha
ecd0: 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73  t it is never us
ece0: 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61  ed again..*/.sta
ecf0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
ed00: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
ed10: 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74  fiedBtrees(sqlit
ed20: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
ed30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
ed40: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ed50: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
ed60: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
ed70: 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65   if( p && sqlite
ed80: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
ed90: 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
eda0: 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
edb0: 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45  ursors(p, SQLITE
edc0: 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20  _ABORT);.    }. 
edd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
ede0: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
edf0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
ee00: 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74  ment opened a st
ee10: 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
ee20: 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74  ion,.** close it
ee30: 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65   now. Argument e
ee40: 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  Op must be eithe
ee50: 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
ee60: 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50  BACK or.** SAVEP
ee70: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66  OINT_RELEASE. If
ee80: 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
ee90: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
eea0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
eeb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
eec0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20  rolled back. If 
eed0: 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54  eOp is SAVEPOINT
eee0: 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74  _RELEASE, then t
eef0: 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
ef00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ef10: 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  commtted..**.** 
ef20: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
ef30: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
ef40: 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
ef50: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
ef60: 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
ef70: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
ef80: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
ef90: 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
efa0: 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
efb0: 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
efc0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
efd0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
efe0: 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
eff0: 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
f000: 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
f010: 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
f020: 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
f030: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f040: 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
f050: 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
f060: 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
f070: 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
f080: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
f090: 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61  have occured, ca
f0a0: 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e  using an emergen
f0b0: 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a  cy rollback..  *
f0c0: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  * In this case (
f0d0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
f0e0: 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  0), and there is
f0f0: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a   nothing to do..
f100: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e    */.  if( db->n
f110: 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e  Statement && p->
f120: 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  iStatement ){.  
f130: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e    int i;.    con
f140: 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
f150: 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
f160: 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t-1;..    assert
f170: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
f180: 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70  _ROLLBACK || eOp
f190: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
f1a0: 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ASE);.    assert
f1b0: 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
f1c0: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
f1d0: 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d  ( p->iStatement=
f1e0: 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  =(db->nStatement
f1f0: 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  +db->nSavepoint)
f200: 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   );..    for(i=0
f210: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
f220: 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ){ .      int rc
f230: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
f240: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f250: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f260: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
f270: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  ){.        if( e
f280: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
f290: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
f2a0: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
f2b0: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
f2c0: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
f2d0: 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
f2e0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
f2f0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d          if( rc2=
f300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f310: 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
f320: 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
f330: 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
f340: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
f350: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
f360: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
f370: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f380: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
f390: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
f3a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f3b0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d  db->nStatement--
f3c0: 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d  ;.    p->iStatem
f3d0: 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ent = 0;..    if
f3e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f3f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
f400: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
f410: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
f420: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
f430: 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
f440: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f450: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
f460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f470: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f480: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
f490: 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
f4a0: 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
f4b0: 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
f4c0: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
f4d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
f4e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
f4f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
f500: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
f510: 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
f520: 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
f530: 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
f540: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
f550: 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
f560: 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
f570: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
f580: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f590: 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
f5a0: 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  /.    if( eOp==S
f5b0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f5c0: 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  K ){.      db->n
f5d0: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
f5e0: 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
f5f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f600: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f610: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
f620: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
f630: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
f640: 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
f650: 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
f660: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
f670: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
f680: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
f690: 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
f6a0: 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
f6b0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
f6c0: 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
f6d0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
f6e0: 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
f6f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
f700: 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
f710: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
f720: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
f730: 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
f740: 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
f750: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
f760: 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
f770: 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
f780: 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
f790: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
f7a0: 54 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61  T and write.** a
f7b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
f7c0: 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
f7d0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
f7e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
f7f0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
f800: 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
f810: 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
f820: 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
f830: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
f840: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
f850: 28 64 65 66 65 72 72 65 64 20 26 26 20 64 62 2d  (deferred && db-
f860: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30  >nDeferredCons>0
f870: 29 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20  ) || (!deferred 
f880: 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
f890: 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d  int>0) ){.    p-
f8a0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
f8b0: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e  STRAINT;.    p->
f8c0: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
f8d0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69  _Abort;.    sqli
f8e0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
f8f0: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66  >zErrMsg, db, "f
f900: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
f910: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
f920: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f930: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
f940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f950: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f960: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f970: 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
f980: 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
f990: 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
f9a0: 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
f9b0: 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
f9c0: 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
f9d0: 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
f9e0: 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
f9f0: 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
fa00: 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
fa10: 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
fa20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
fa30: 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
fa40: 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
fa50: 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
fa60: 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
fa70: 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
fa80: 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
fa90: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
faa0: 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
fab0: 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
fac0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
fad0: 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
fae0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
faf0: 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
fb00: 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
fb10: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
fb20: 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
fb30: 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
fb40: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
fb50: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
fb60: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
fb70: 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
fb80: 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
fb90: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
fba0: 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
fbb0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
fbc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
fbd0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fbf0: 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
fc00: 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
fc10: 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
fc20: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
fc30: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
fc40: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
fc50: 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
fc60: 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
fc70: 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
fc80: 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
fc90: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
fca0: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
fcb0: 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
fcc0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
fcd0: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
fce0: 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
fcf0: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
fd00: 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
fd10: 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
fd20: 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
fd30: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
fd40: 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
fd50: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
fd60: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
fd70: 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
fd80: 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
fd90: 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
fda0: 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
fdb0: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
fdc0: 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
fdd0: 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
fde0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
fdf0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
fe00: 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
fe10: 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
fe20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
fe30: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
fe40: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
fe50: 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
fe60: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
fe70: 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
fe80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
fe90: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  .  }.  closeAllC
fea0: 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28  ursors(p);.  if(
feb0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
fec0: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
fed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fee0: 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63  K;.  }.  checkAc
fef0: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
ff00: 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
ff10: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
ff20: 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
ff30: 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
ff40: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
ff50: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  =0 ){.    int mr
ff60: 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
ff70: 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
ff80: 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
ff90: 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
ffa0: 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
ffb0: 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
ffc0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
ffd0: 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
ffe0: 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
fff0: 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
10000 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
10010 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
10020 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
10030 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
10040 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
10050 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
10060 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
10070 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
10080 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
10090 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
100a0 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69  OCKED );  /* Thi
100b0 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65  s error no longe
100c0 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  r exists */.    
100d0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
100e0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
100f0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
10100 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10120 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
10130 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
10140 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
10150 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
10160 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
10170 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
10180 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
10190 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
101a0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
101b0 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
101c0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
101d0 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
101e0 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
101f0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
10200 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
10210 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
10220 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
10230 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
10240 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
10250 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
10260 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
10270 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
10280 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
10290 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
102a0 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
102b0 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
102c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
102d0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
102e0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
102f0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20       ** occured 
10300 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
10310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
10320 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
10330 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
10340 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
10350 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
10360 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
10370 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
10380 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
10390 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
103a0 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
103b0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
103c0 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
103d0 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
103e0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
103f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10400 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
10410 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
10420 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
10430 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
10440 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
10450 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
10460 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
10470 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
10480 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
10490 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
104a0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
104b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
104c0 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
104d0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
104e0 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
104f0 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
10500 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
10510 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
10520 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
10530 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
10540 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
10550 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
10560 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
10570 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66  teCursorsOnModif
10580 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20  iedBtrees(db);. 
10590 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
105a0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
105b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
105c0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
105d0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
105e0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
105f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
10600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10610 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69    /* Check for i
10620 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
10630 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e   key violations.
10640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
10650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10670 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a  eCheckFk(p, 0);.
10680 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
10690 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
106a0 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
106b0 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
106c0 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65  nly active write
106d0 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68  r .    ** VM, th
106e0 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  en we do either 
106f0 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
10700 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
10710 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
10720 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
10730 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
10740 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
10750 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
10760 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
10770 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
10780 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
10790 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
107a0 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
107b0 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
107c0 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
107d0 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62   && db->writeVdb
107e0 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  eCnt==(p->readOn
107f0 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
10800 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
10810 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
10820 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
10830 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
10840 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
10850 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10860 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
10870 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
10880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
108a0 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
108b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
108c0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
108d0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
108e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
108f0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
10900 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
10910 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
10920 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  INT;.        }el
10930 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
10940 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
10950 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
10960 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
10970 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
10980 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
10990 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
109a0 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
109b0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
109c0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
109d0 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
109e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
109f0 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
10a00 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
10a10 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
10a20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
10a30 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
10a40 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
10a50 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
10a60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10a70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
10a80 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
10a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10aa0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
10ab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
10ac0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
10ad0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10ae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
10b00 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
10b10 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
10b20 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
10b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10b40 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
10b50 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
10b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
10b70 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
10b80 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
10b90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
10ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
10bb0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
10bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
10bd0 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
10be0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
10bf0 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
10c00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
10c10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
10c20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
10c30 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
10c40 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
10c50 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
10c60 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
10c70 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
10c80 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
10c90 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
10ca0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
10cb0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
10cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10cd0 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
10ce0 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
10cf0 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
10d00 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
10d10 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
10d20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
10d30 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
10d40 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
10d50 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
10d60 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
10d70 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
10d80 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
10d90 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
10da0 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
10db0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
10dc0 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
10dd0 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
10de0 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
10df0 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
10e00 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
10e10 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
10e20 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
10e30 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
10e40 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
10e50 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
10e60 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
10e70 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
10e80 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
10e90 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
10ea0 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
10eb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10ec0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
10ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10ee0 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
10ef0 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
10f00 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
10f10 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
10f20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10f30 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
10f40 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
10f60 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
10f70 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10f80 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
10f90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
10fa0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
10fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10fc0 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
10fd0 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
10fe0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10ff0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
11000 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
11010 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
11020 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
11030 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
11040 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
11050 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
11060 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
11070 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
11080 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
11090 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
110a0 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
110b0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
110c0 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
110d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
110e0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
110f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11100 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
11110 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
11120 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
11130 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
11140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11150 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
11160 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
11170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
11190 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
111a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
111b0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
111c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
111d0 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ollback or commi
111e0 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61  t any schema cha
111f0 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72  nges that occurr
11200 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
11210 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
11220 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  && db->flags&SQL
11230 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
11240 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
11250 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
11260 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20  chema(db, -1);. 
11270 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d       db->flags =
11280 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51   (db->flags | SQ
11290 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
112a0 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  es);.    }..    
112b0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
112c0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
112d0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
112e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
112f0 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
11300 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
11310 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
11320 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
11330 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
11340 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
11350 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69  VdbeCnt--;.    i
11360 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
11370 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69  ){.      db->wri
11380 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  teVdbeCnt--;.   
11390 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
113a0 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
113b0 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  >=db->writeVdbeC
113c0 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt );.  }.  p->m
113d0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
113e0 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
113f0 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
11400 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
11410 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
11420 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
11430 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
11440 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
11450 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
11460 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20  t to true, then 
11470 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  any locks that w
11480 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79  ere held.  ** by
11490 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
114a0 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c  ave now been rel
114b0 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69  eased. Call sqli
114c0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
114d0 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f  ocked() .  ** to
114e0 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75   invoke any requ
114f0 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ired unlock-noti
11500 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
11510 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  */.  if( db->aut
11520 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73  oCommit ){.    s
11530 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
11540 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20  Unlocked(db);.  
11550 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  }..  assert( db-
11560 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30  >activeVdbeCnt>0
11570 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
11580 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
11590 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
115a0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
115b0 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
115c0 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
115d0 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
115e0 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
115f0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
11600 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
11610 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
11620 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
11630 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
11640 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
11650 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
11660 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11670 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
11680 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
11690 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
116a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
116b0 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
116c0 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
116d0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
116e0 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
116f0 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
11700 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
11710 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
11720 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
11730 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
11740 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
11750 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
11760 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
11770 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
11780 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
11790 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
117a0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
117b0 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
117c0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
117d0 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
117e0 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
117f0 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
11800 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
11810 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
11820 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
11830 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
11840 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
11850 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
11860 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
11870 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
11880 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
11890 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
118a0 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
118b0 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
118c0 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
118d0 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
118e0 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
118f0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
11900 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
11910 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
11920 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76  BE has be run ev
11930 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
11940 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
11950 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
11960 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
11970 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
11980 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
11990 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
119a0 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
119b0 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
119c0 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
119d0 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
119e0 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
119f0 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
11a00 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
11a10 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
11a20 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
11a30 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
11a40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
11a50 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
11a60 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
11a70 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
11a80 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11a90 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11aa0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
11ab0 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51  -1,p->zErrMsg,SQ
11ac0 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45  LITE_UTF8,SQLITE
11ad0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
11ae0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
11af0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
11b00 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
11b10 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71   p->rc;.      sq
11b20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11b30 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
11b40 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
11b50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
11b60 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
11b70 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
11b80 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
11b90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
11ba0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
11bb0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20  LITE_OK, 0);.   
11bc0 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75   }.    if( p->ru
11bd0 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
11be0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
11bf0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
11c00 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
11c10 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
11c20 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
11c30 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
11c40 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
11c50 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
11c60 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
11c70 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
11c80 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
11c90 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
11ca0 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
11cb0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
11cc0 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
11cd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
11ce0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
11cf0 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >rc, 0);.    sql
11d00 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
11d10 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
11d20 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
11d30 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52  _UTF8, SQLITE_TR
11d40 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
11d50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11d60 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
11d70 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
11d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
11d90 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
11da0 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
11db0 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
11dc0 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
11dd0 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
11de0 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
11df0 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
11e00 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
11e10 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
11e20 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
11e30 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
11e40 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
11e50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
11e60 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
11e70 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
11e80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
11e90 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
11ea0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
11eb0 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
11ec0 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
11ed0 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
11ee0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
11ef0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11f00 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
11f10 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
11f20 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38  , "%6d %10lld %8
11f30 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  lld ",.         
11f40 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
11f50 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
11f60 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
11f70 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
11f80 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
11f90 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
11fa0 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
11fb0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
11fc0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
11fd0 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
11fe0 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
11ff0 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
12000 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
12010 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ndif.  p->magic 
12020 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
12030 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  T;.  return p->r
12040 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
12050 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
12060 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
12070 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
12080 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
12090 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
120a0 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
120b0 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
120c0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
120d0 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
120e0 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
120f0 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
12100 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
12110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12120 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
12130 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
12140 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
12150 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
12160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12170 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
12180 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
12190 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
121a0 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rc );.  }.  sqli
121b0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
121c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
121d0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ../*.** Call the
121e0 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
121f0 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74  each auxdata ent
12200 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20  ry in pVdbeFunc 
12210 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65  for which.** the
12220 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
12230 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c  it in mask is cl
12240 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e  ear.  Auxdata en
12250 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a  tries beyond 31.
12260 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65  ** are always de
12270 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73  stroyed.  To des
12280 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61  troy all auxdata
12290 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74   entries, call t
122a0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  his.** routine w
122b0 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a  ith mask==0..*/.
122c0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
122d0 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64  DeleteAuxData(Vd
122e0 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
122f0 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  c, int mask){.  
12300 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
12310 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e  ; i<pVdbeFunc->n
12320 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Aux; i++){.    s
12330 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70  truct AuxData *p
12340 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63  Aux = &pVdbeFunc
12350 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20  ->apAux[i];.    
12360 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d  if( (i>31 || !(m
12370 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69  ask&(((u32)1)<<i
12380 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75  ))) && pAux->pAu
12390 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  x ){.      if( p
123a0 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
123b0 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
123c0 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
123d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
123e0 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b   pAux->pAux = 0;
123f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12400 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
12410 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
12420 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73  ith the Vdbe pas
12430 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
12440 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54  d argument..** T
12450 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
12460 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
12470 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56  ion and sqlite3V
12480 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74  dbeDelete() is t
12490 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74  hat.** VdbeDelet
124a0 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73  e() also unlinks
124b0 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
124c0 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61  he list of VMs a
124d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
124e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
124f0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
12500 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12510 6c 65 74 65 4f 62 6a 65 63 74 28 73 71 6c 69 74  leteObject(sqlit
12520 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
12530 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
12540 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
12550 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
12560 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
12570 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
12580 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
12590 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
125a0 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
125b0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
125c0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
125d0 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
125e0 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
125f0 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
12600 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
12610 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
12620 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
12630 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
12640 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
12650 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12660 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f   pSub);.  }.  fo
12670 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20  r(i=p->nzVar-1; 
12680 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74  i>=0; i--) sqlit
12690 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
126a0 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62  azVar[i]);.  vdb
126b0 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
126c0 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
126d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
126e0 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  e(db, p->aLabel)
126f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12700 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
12710 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
12720 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
12730 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12740 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
12750 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12760 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
12770 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
12780 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
12790 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
127a0 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
127b0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
127c0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
127d0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
127e0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  p->db;.  if( p->
127f0 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
12800 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
12810 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
12820 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
12830 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
12840 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
12850 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
12860 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
12870 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
12880 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
12890 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
128a0 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
128b0 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
128c0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
128d0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d  Object(db, p);.}
128e0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
128f0 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
12900 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
12910 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
12920 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
12930 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
12940 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
12950 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
12960 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
12970 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
12980 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
12990 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
129a0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
129b0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
129c0 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
129d0 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
129e0 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
129f0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
12a00 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
12a10 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
12a20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
12a30 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
12a40 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
12a50 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
12a60 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
12a70 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
12a80 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
12a90 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
12aa0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
12ab0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
12ac0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
12ad0 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
12ae0 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
12af0 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
12b00 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
12b10 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
12b20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12b30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
12b40 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
12b50 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
12b60 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
12b70 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
12b80 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
12b90 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
12ba0 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
12bb0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
12bc0 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
12bd0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
12be0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
12bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
12c00 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
12c10 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
12c20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
12c30 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
12c40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12c50 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  c;.    p->lastRo
12c60 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
12c70 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72  arget;.    if( r
12c80 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
12c90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12ca0 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  PT;.    p->rowid
12cb0 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66  IsValid = 1;.#if
12cc0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
12cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
12ce0 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
12cf0 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
12d00 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
12d10 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
12d20 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
12d30 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
12d40 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  YS(p->pCursor) )
12d50 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
12d60 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
12d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
12d80 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
12d90 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
12da0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
12db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12dc0 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
12dd0 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
12de0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
12df0 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c  LE;.      p->nul
12e00 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lRow = 1;.    }.
12e10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12e20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12e30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
12e40 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
12e50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12e60 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
12e70 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
12e80 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
12e90 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
12ea0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
12eb0 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
12ec0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
12ed0 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
12ee0 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
12ef0 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
12f00 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
12f10 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
12f20 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
12f30 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
12f40 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
12f50 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
12f60 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
12f70 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
12f80 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
12f90 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
12fa0 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
12fb0 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
12fc0 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
12fd0 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
12fe0 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
12ff0 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
13000 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
13010 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
13020 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
13030 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
13040 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
13050 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
13060 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
13070 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
13080 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
13090 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
130a0 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
130b0 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
130c0 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
130d0 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
130e0 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
130f0 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
13100 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
13110 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
13120 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
13130 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
13140 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
13150 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
13160 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
13170 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
13180 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
13190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
131a0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
131b0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
131c0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131e0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
131f0 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
13220 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13230 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
13250 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
13260 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13270 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
13280 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
13290 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
132a0 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
132d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
132e0 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
132f0 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
13300 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13310 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13320 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
13330 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
13340 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13350 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
13380 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
13390 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
133a0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
133b0 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
133c0 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
133f0 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
13400 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
13430 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
13440 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
13450 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
13460 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
13470 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
13480 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
13490 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
134a0 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
134b0 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
134c0 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
134d0 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
134e0 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
134f0 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
13500 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
13510 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
13520 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
13530 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
13540 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
13550 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
13560 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
13570 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
13580 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
13590 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
135a0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
135b0 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
135c0 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
135d0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
135e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
135f0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
13600 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
13610 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
13620 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
13630 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
13640 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
13650 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
13660 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
13670 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
13680 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
13690 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   u;.    if( file
136a0 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69  _format>=4 && (i
136b0 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  &1)==i ){.      
136c0 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b  return 8+(u32)i;
136d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
136e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
136f0 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29  i<(-MAX_6BYTE) )
13700 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20   return 6;.     
13710 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73   /* Previous tes
13720 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d  t prevents:  u =
13730 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35   -(-922337203685
13740 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20  4775808) */.    
13750 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65    u = -i;.    }e
13760 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
13770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13780 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
13790 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
137a0 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
137b0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
137c0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
137d0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
137e0 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
137f0 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
13800 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
13810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
13820 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
13830 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
13840 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
13850 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
13860 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
13870 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
13880 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
13890 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
138a0 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
138b0 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
138c0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
138d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
138e0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
138f0 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
13900 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
13910 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
13920 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
13930 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
13940 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
13950 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
13960 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ype..*/.u32 sqli
13970 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
13980 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
13990 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
139a0 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
139b0 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
139c0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
139d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
139e0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
139f0 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
13a00 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
13a10 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
13a20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
13a30 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
13a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
13a50 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
13a60 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
13a70 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
13a80 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
13a90 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
13aa0 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
13ab0 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
13ac0 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
13ad0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
13ae0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
13af0 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
13b00 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
13b10 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
13b20 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
13b30 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
13b40 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
13b50 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
13b60 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
13b70 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
13b80 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
13b90 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
13ba0 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
13bb0 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
13bc0 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
13bd0 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
13be0 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
13bf0 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
13c00 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
13c10 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
13c20 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
13c30 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
13c40 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
13c50 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
13c60 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
13c70 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
13c80 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
13c90 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
13ca0 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
13cb0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
13cc0 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
13cd0 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
13ce0 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
13cf0 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
13d00 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
13d10 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
13d20 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
13d30 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
13d40 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
13d50 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
13d60 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
13d70 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
13d80 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
13d90 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
13da0 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
13db0 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
13dc0 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
13dd0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
13de0 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
13df0 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
13e00 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
13e10 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
13e20 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
13e30 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
13e40 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
13e50 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
13e60 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
13e70 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
13e80 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
13e90 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
13ea0 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
13eb0 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
13ec0 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
13ed0 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
13ee0 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
13ef0 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
13f00 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
13f10 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
13f20 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
13f30 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
13f40 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
13f50 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
13f60 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
13f70 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
13f80 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
13f90 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
13fa0 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
13fb0 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
13fc0 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
13fd0 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
13fe0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
13ff0 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
14000 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
14010 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
14020 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
14030 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
14040 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
14050 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
14060 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
14070 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
14080 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
14090 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
140a0 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
140b0 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
140c0 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
140d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
140e0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
140f0 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
14100 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
14110 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
14120 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
14130 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
14140 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
14150 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
14160 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
14170 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
14180 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
14190 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
141a0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
141b0 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
141c0 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
141d0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
141e0 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
141f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
14200 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
14210 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
14220 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
14230 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
14240 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
14250 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
14260 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
14270 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
14280 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
14290 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
142a0 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
142b0 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
142c0 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
142d0 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
142e0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
142f0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
14300 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
14310 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
14320 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
14330 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
14340 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
14350 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
14360 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
14370 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
14380 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
14390 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
143a0 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
143b0 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
143c0 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
143d0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
143e0 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
143f0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
14400 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
14410 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
14420 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
14430 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
14440 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
14450 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
14460 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
14470 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
14480 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
14490 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
144a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
144b0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
144c0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
144d0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
144e0 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
144f0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
14500 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
14510 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
14520 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
14530 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
14540 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
14550 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
14560 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
14570 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
14580 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
14590 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
145a0 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
145b0 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
145c0 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
145d0 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
145e0 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
145f0 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
14600 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
14610 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
14620 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
14630 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
14640 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
14650 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
14660 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
14670 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
14680 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
14690 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
146a0 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
146b0 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
146c0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
146d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
146e0 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
146f0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
14700 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
14710 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
14720 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
14730 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33  assert( len<=(u3
14740 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68  2)nBuf );.    wh
14750 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20  ile( i-- ){.    
14760 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28    buf[i] = (u8)(
14770 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
14780 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20   >>= 8;.    }.  
14790 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
147a0 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
147b0 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
147c0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
147d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
147e0 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
147f0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
14800 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
14810 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
14820 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
14830 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
14840 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
14850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
14860 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20  em->n<=nBuf );. 
14870 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e     len = pMem->n
14880 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66  ;.    memcpy(buf
14890 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
148a0 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66  .    if( pMem->f
148b0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
148c0 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  ){.      len += 
148d0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
148e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75       assert( nBu
148f0 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f>=0 );.      if
14900 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75  ( len > (u32)nBu
14910 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  f ){.        len
14920 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20   = (u32)nBuf;.  
14930 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
14940 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d  et(&buf[pMem->n]
14950 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e  , 0, len-pMem->n
14960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
14970 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
14980 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
14990 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
149a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
149b0 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
149c0 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
149d0 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
149e0 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
149f0 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
14a00 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
14a10 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
14a20 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14a30 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
14a40 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
14a50 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
14a60 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14a70 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
14a80 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
14a90 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
14aa0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ac0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
14ad0 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
14ae0 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b00 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
14b10 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
14b20 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
14b30 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
14b40 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
14b50 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
14b60 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
14b70 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
14b80 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
14b90 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
14ba0 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
14bb0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
14bc0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
14bd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14be0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
14bf0 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
14c00 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
14c10 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
14c20 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75   (signed char)bu
14c30 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[0];.      pMem
14c40 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14c50 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
14c60 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
14c70 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
14c80 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14c90 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
14ca0 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
14cb0 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
14cc0 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
14cd0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14ce0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
14cf0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
14d00 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
14d10 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14d20 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
14d30 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
14d40 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
14d50 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
14d60 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
14d70 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14d80 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
14d90 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
14da0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
14db0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
14dc0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
14dd0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66  pMem->u.i = (buf
14de0 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
14df0 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
14e00 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
14e10 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14e20 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14e30 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
14e40 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
14e50 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
14e60 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14e70 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69     u64 x = (((si
14e80 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
14e90 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
14ea0 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62        u32 y = (b
14eb0 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[2]<<24) | (bu
14ec0 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[3]<<16) | (buf
14ed0 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d  [4]<<8) | buf[5]
14ee0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
14ef0 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70  32) | y;.      p
14f00 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
14f10 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
14f20 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14f30 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
14f40 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
14f50 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
14f60 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14f70 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
14f80 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
14f90 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
14fa0 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33   u64 x;.      u3
14fb0 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  2 y;.#if !define
14fc0 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
14fd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14fe0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
14ff0 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
15000 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
15010 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
15020 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
15030 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
15040 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
15050 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
15060 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
15070 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
15080 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
15090 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
150a0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
150b0 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
150c0 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
150d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
150e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
150f0 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
15100 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
15110 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
15120 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
15130 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
15140 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
15150 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
15160 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
15170 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
15180 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
15190 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
151a0 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
151b0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
151c0 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
151d0 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
151e0 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
151f0 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
15200 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
15210 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
15220 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
15230 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
15240 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
15250 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
15260 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
15270 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
15280 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
15290 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
152a0 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  nt;.      }else{
152b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
152c0 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
152d0 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
152e0 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
152f0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
15300 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
15310 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
15320 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
15330 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
15340 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
15350 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d  NaN(pMem->r) ? M
15360 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
15370 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
15380 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
15390 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
153a0 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
153b0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
153c0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
153d0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
153e0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
153f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15400 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15410 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15420 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
15430 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e   {.      u32 len
15440 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
15450 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
15460 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
15470 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
15480 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70  n = len;.      p
15490 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
154a0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
154b0 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20  type&0x01 ){.   
154c0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
154d0 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d   = MEM_Str | MEM
154e0 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65  _Ephem;.      }e
154f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
15500 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
15510 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  lob | MEM_Ephem;
15520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15530 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d  eturn len;.    }
15540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15550 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  .}.../*.** Given
15560 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
15570 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
15580 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
15590 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f  arse the.** reco
155a0 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b  rd into a Unpack
155b0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
155c0 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  re.  Return a po
155d0 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
155e0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
155f0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
15600 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f  nction might pro
15610 76 69 64 65 20 73 7a 53 70 61 63 65 20 62 79 74  vide szSpace byt
15620 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  es of memory.** 
15630 73 70 61 63 65 20 61 74 20 70 53 70 61 63 65 2e  space at pSpace.
15640 20 20 54 68 69 73 20 73 70 61 63 65 20 63 61 6e    This space can
15650 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   be used to hold
15660 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
15670 20 56 44 62 65 50 61 72 73 65 64 52 65 63 6f 72   VDbeParsedRecor
15680 64 20 73 74 72 75 63 74 75 72 65 20 69 66 20 69  d structure if i
15690 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
156a0 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20  h.  If it is.** 
156b0 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20  not big enough, 
156c0 73 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65  space is obtaine
156d0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
156e0 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  alloc()..**.** T
156f0 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 75  he returned stru
15700 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20  cture should be 
15710 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c  closed by a call
15720 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   to.** sqlite3Vd
15730 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
15740 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e  Record()..*/ .Un
15750 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
15760 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
15770 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
15780 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15790 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
157a0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
157b0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
157c0 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
157d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
157e0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
157f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
15800 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
15810 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
15820 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
15830 63 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ce,          /* 
15840 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20  Unaligned space 
15850 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c  available to hol
15860 64 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  d the object */.
15870 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20    int szSpace   
15880 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15890 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
158a0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  bytes */.){.  co
158b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
158c0 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
158d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
158e0 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65  )pKey;.  Unpacke
158f0 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20  dRecord *p;  /* 
15900 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  The unpacked rec
15910 6f 72 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c  ord that we will
15920 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15930 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
15940 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
15950 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
15960 70 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  p, in bytes */. 
15970 20 69 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64   int d;.  u32 id
15980 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20  x;.  u16 u;     
15990 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
159a0 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
159b0 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
159c0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
159d0 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
159e0 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65       /* Increase
159f0 20 70 53 70 61 63 65 20 62 79 20 74 68 69 73 20   pSpace by this 
15a00 6d 75 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61  much to 8-byte a
15a10 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20  lign it */.  .  
15a20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20  /*.  ** We want 
15a30 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69  to shift the poi
15a40 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73  nter pSpace up s
15a50 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38  uch that it is 8
15a60 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20  -byte aligned.. 
15a70 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65   ** Thus, we nee
15a80 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61  d to calculate a
15a90 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65   value, nOff, be
15aa0 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74  tween 0 and 7, t
15ab0 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74  o shift .  ** it
15ac0 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20   by.  If pSpace 
15ad0 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74  is already 8-byt
15ae0 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20  e aligned, nOff 
15af0 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a  should be zero..
15b00 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38    */.  nOff = (8
15b10 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54   - (SQLITE_PTR_T
15b20 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20  O_INT(pSpace) & 
15b30 37 29 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63  7)) & 7;.  pSpac
15b40 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53  e += nOff;.  szS
15b50 70 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20  pace -= nOff;.  
15b60 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
15b70 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
15b80 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
15b90 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
15ba0 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28  nField+1);.  if(
15bb0 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29   nByte>szSpace )
15bc0 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
15bd0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
15be0 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
15bf0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
15c00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
15c10 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43  p->flags = UNPAC
15c20 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20  KED_NEED_FREE | 
15c30 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45  UNPACKED_NEED_DE
15c40 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  STROY;.  }else{.
15c50 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
15c60 64 52 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b  dRecord*)pSpace;
15c70 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
15c80 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45  UNPACKED_NEED_DE
15c90 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e  STROY;.  }.  p->
15ca0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
15cb0 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
15cc0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
15cd0 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d  eld + 1;.  p->aM
15ce0 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d  em = pMem = (Mem
15cf0 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
15d00 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
15d10 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
15d20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
15d30 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d  YTE_ALIGNMENT(pM
15d40 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67  em) );.  idx = g
15d50 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
15d60 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
15d70 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
15d80 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
15d90 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64  r && u<p->nField
15da0 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
15db0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
15dc0 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
15dd0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
15de0 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
15df0 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
15e00 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
15e10 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
15e20 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
15e30 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
15e40 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
15e50 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
15e60 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
15e70 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
15e80 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  pMem->zMalloc = 
15e90 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
15ea0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
15eb0 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
15ec0 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
15ed0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75     pMem++;.    u
15ee0 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
15ef0 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
15f00 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
15f10 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20  ->nField = u;.  
15f20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b  return (void*)p;
15f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15f40 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20  outine destroys 
15f50 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  a UnpackedRecord
15f60 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
15f70 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
15f80 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
15f90 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
15fa0 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
15fb0 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 69  TE_DEBUG.  int i
15fc0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a  ;.  Mem *pMem;..
15fd0 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
15fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66  ;.  assert( p->f
15ff0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
16000 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29 3b 0a  NEED_DESTROY );.
16010 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d    for(i=0, pMem=
16020 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46  p->aMem; i<p->nF
16030 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b  ield; i++, pMem+
16040 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 75  +){.    /* The u
16050 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 69  npacked record i
16060 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 72 75  s always constru
16070 63 74 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  cted by the.    
16080 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 55 6e  ** sqlite3VdbeUn
16090 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e  packRecord() fun
160a0 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68 69  ction above, whi
160b0 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20  ch makes all.   
160c0 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20   ** strings and 
160d0 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20 20 41  blobs static.  A
160e0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65  nd none of the e
160f0 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20 20 20  lements are.    
16100 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66 6f 72  ** ever transfor
16110 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  med, so there is
16120 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e 67 20   never anything 
16130 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 20 2a  to delete..    *
16140 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
16150 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29  pMem->zMalloc) )
16160 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
16170 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
16180 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
16190 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
161a0 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a  ED_NEED_FREE ){.
161b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
161c0 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  e(p->pKeyInfo->d
161d0 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
161e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
161f0 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
16200 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
16210 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
16220 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
16230 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
16240 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
16250 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
16260 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
16270 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
16280 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
16290 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
162a0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
162b0 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
162c0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
162d0 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
162e0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
162f0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
16300 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
16310 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
16320 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
16330 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
16340 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
16350 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
16360 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
16370 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
16380 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
16390 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
163a0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
163b0 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
163c0 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
163d0 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
163e0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
163f0 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
16400 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
16410 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
16420 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
16430 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
16440 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
16450 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
16460 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
16470 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
16480 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
16490 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
164a0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
164b0 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
164c0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
164d0 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
164e0 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
164f0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
16500 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
16510 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
16520 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
16530 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47   the UNPACKED_IG
16540 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20  NORE_ROWID flag 
16550 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
16560 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a   last byte of.**
16570 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70   the header of p
16580 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e  Key1 is ignored.
16590 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
165a0 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a  that pKey1 is.**
165b0 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61   an index key, a
165c0 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74  nd thus ends wit
165d0 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  h a rowid value.
165e0 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a    The last byte.
165f0 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ** of the header
16600 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
16610 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  be the serial ty
16620 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a  pe of the rowid:
16630 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c  .** one of 1, 2,
16640 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20   3, 4, 5, 6, 8, 
16650 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67  or 9 - the integ
16660 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  er serial types.
16670 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74  .** The serial t
16680 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c  ype of the final
16690 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61   rowid will alwa
166a0 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62  ys be a single b
166b0 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72  yte..** By ignor
166c0 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79  ing this last by
166d0 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
166e0 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63  , we force the c
166f0 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20  omparison.** to 
16700 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64  ignore the rowid
16710 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b   at the end of k
16720 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ey1..*/.int sqli
16730 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
16740 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
16750 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
16760 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
16770 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
16780 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
16790 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
167a0 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
167b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
167c0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
167d0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
167e0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
167f0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
16800 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
16810 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
16820 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
16830 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
16840 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16850 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
16860 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
16870 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
16880 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
16890 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
168a0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
168b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
168c0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
168d0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
168e0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
168f0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
16900 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
16910 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
16920 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
16930 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
16940 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
16950 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
16960 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
16970 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
16980 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
16990 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61  A_ONLY( mem1.zMa
169a0 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
169b0 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
169c0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
169d0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
169e0 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
169f0 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
16a00 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
16a10 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
16a20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
16a30 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
16a40 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
16a50 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
16a60 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
16a70 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
16a80 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
16a90 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
16aa0 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
16ab0 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
16ac0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
16ad0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
16ae0 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
16af0 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
16b00 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
16b10 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
16b20 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
16b30 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
16b40 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
16b50 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
16b60 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
16b70 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
16b80 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
16b90 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
16ba0 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
16bb0 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
16bc0 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
16bd0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
16be0 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
16bf0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
16c00 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64  y1, szHdr1);.  d
16c10 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 66  1 = szHdr1;.  if
16c20 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
16c30 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  & UNPACKED_IGNOR
16c40 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 73  E_ROWID ){.    s
16c50 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e  zHdr1--;.  }.  n
16c60 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
16c70 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
16c80 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
16c90 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
16ca0 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
16cb0 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
16cc0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
16cd0 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
16ce0 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
16cf0 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
16d00 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61     idx1 += getVa
16d10 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64  rint32( aKey1+id
16d20 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
16d30 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d   );.    if( d1>=
16d40 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33  nKey1 && sqlite3
16d50 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16d60 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
16d70 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
16d80 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
16d90 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
16da0 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
16db0 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
16dc0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
16dd0 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
16de0 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
16df0 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
16e00 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
16e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
16e20 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
16e30 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
16e40 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3c                i<
16e60 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66  nField ? pKeyInf
16e70 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
16e80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
16e90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16ea0 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
16eb0 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
16ec0 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20  ent below */..  
16ed0 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68      /* Invert th
16ee0 65 20 72 65 73 75 6c 74 20 69 66 20 77 65 20 61  e result if we a
16ef0 72 65 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f  re using DESC so
16f00 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
16f10 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
16f20 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69  >aSortOrder && i
16f30 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49  <nField && pKeyI
16f40 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
16f50 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
16f60 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
16f70 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66      .      /* If
16f80 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52   the PREFIX_SEAR
16f90 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  CH flag is set a
16fa0 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  nd all fields ex
16fb0 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  cept the final. 
16fc0 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69       ** rowid fi
16fd0 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20  eld were equal, 
16fe0 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50  then clear the P
16ff0 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61  REFIX_SEARCH fla
17000 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20  g and set .     
17010 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69   ** pPKey2->rowi
17020 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  d to the value o
17030 66 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  f the rowid fiel
17040 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65  d in (pKey1, nKe
17050 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  y1)..      ** Th
17060 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
17070 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70  e OP_IsUnique op
17080 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  code..      */. 
17090 20 20 20 20 20 69 66 28 20 28 70 50 4b 65 79 32       if( (pPKey2
170a0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
170b0 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
170c0 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d  ) && i==(pPKey2-
170d0 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20  >nField-1) ){.  
170e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
170f0 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63  x1==szHdr1 && rc
17100 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
17110 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26  rt( mem1.flags &
17120 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
17130 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67      pPKey2->flag
17140 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50  s &= ~UNPACKED_P
17150 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20  REFIX_SEARCH;.  
17160 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f        pPKey2->ro
17170 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a  wid = mem1.u.i;.
17180 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
17190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
171a0 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
171b0 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
171c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
171d0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
171e0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
171f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
17200 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
17210 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
17220 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
17230 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
17240 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
17250 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
17260 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
17270 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
17280 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
17290 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
172a0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
172b0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
172c0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
172d0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
172e0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
172f0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
17300 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
17310 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
17320 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67  NCRKEY.  ** flag
17330 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72   is set, then br
17340 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74  eak the tie by t
17350 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20  reating key2 as 
17360 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20  larger..  ** If 
17370 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46  the UPACKED_PREF
17380 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73  IX_MATCH flag is
17390 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20   set, then keys 
173a0 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66  with common pref
173b0 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ixes.  ** are co
173c0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
173d0 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  qual.  Otherwise
173e0 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79  , the longer key
173f0 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61   is the .  ** la
17400 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70  rger.  As it hap
17410 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32  pens, the pPKey2
17420 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
17430 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20  the longer.  ** 
17440 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
17450 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
17460 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
17470 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
17480 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
17490 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20  _INCRKEY ){.    
174a0 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  rc = -1;.  }else
174b0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
174c0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
174d0 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
174e0 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30    /* Leave rc==0
174f0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
17500 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20  idx1<szHdr1 ){. 
17510 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
17520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
17530 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
17540 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
17550 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
17560 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
17570 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
17580 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
17590 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
175a0 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
175b0 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
175c0 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
175d0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
175e0 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
175f0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
17600 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
17610 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
17620 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
17630 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
17640 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
17650 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
17660 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
17670 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
17680 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
17690 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
176a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
176b0 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
176c0 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
176d0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
176e0 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
176f0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
17700 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
17710 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
17720 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
17730 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
17740 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
17750 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
17760 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
17770 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
17780 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
17790 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
177a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
177b0 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
177c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
177d0 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
177e0 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
177f0 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
17800 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
17810 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
17820 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
17830 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17840 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
17850 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
17860 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
17870 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
17880 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
17890 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
178a0 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
178b0 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
178c0 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
178d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
178e0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
178f0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72  lid(pCur) );.  r
17900 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
17910 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
17920 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
17930 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
17940 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72  K );     /* pCur
17950 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
17960 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
17970 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73  ot fail */.  ass
17980 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26  ert( (nCellKey &
17990 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
179a0 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20  ==(u64)nCellKey 
179b0 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  );..  /* Read in
179c0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
179d0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64  ntent of the ind
179e0 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65  ex entry */.  me
179f0 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
17a00 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
17a10 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
17a20 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
17a30 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (int)nCellKey, 1
17a40 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
17a50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17a60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
17a70 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
17a80 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
17a90 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
17aa0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
17ab0 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
17ac0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
17ad0 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
17ae0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
17af0 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
17b00 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
17b10 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
17b20 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
17b30 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
17b40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
17b50 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
17b60 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
17b70 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
17b80 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
17b90 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
17ba0 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
17bb0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
17bc0 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
17bd0 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
17be0 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
17bf0 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
17c00 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
17c10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17c20 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
17c30 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17c40 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
17c50 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17c60 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
17c70 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
17c80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17c90 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
17ca0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17cb0 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
17cc0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17cd0 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
17ce0 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
17cf0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
17d00 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
17d10 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17d20 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17d30 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
17d40 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
17d50 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
17d60 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
17d70 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
17d80 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
17d90 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
17da0 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
17db0 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
17dc0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
17dd0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
17de0 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
17df0 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
17e00 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
17e10 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
17e20 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17e30 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
17e40 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
17e50 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
17e60 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
17e70 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
17e80 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
17e90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
17ea0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
17eb0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17ec0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
17ed0 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
17ee0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
17ef0 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
17f00 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
17f10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
17f20 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
17f30 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
17f40 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30  se( m.zMalloc!=0
17f50 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
17f60 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
17f70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17f80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
17f90 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
17fa0 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
17fb0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
17fc0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
17fd0 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
17fe0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
17ff0 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
18000 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
18010 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
18020 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
18030 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
18040 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
18050 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
18060 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
18070 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
18080 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18090 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
180a0 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
180b0 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
180c0 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
180d0 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
180e0 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
180f0 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
18100 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
18110 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
18120 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
18130 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
18140 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
18150 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
18160 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
18170 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
18180 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
18190 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
181a0 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
181b0 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
181c0 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
181d0 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75  ompare(.  VdbeCu
181e0 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
181f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
18200 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
18210 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
18220 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
18230 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63  acked,  /* Unpac
18240 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b  ked version of k
18250 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  ey to compare ag
18260 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ainst */.  int *
18270 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
18280 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18290 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
182a0 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
182b0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
182c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
182d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
182e0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
182f0 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72   Mem m;..  asser
18300 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
18310 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
18320 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
18330 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
18340 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
18350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
18360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
18370 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
18380 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
18390 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
183a0 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79  */.  /* nCellKey
183b0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
183c0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78  between 0 and 0x
183d0 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65  ffffffff because
183e0 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a   of the say.  **
183f0 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65   that btreeParse
18400 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71  CellPtr() and sq
18410 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
18420 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
18430 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c  ed */.  if( nCel
18440 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c  lKey<=0 || nCell
18450 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29  Key>0x7fffffff )
18460 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
18470 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18480 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18490 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c    }.  memset(&m,
184a0 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
184b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
184c0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
184d0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
184e0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  int)nCellKey, 1,
184f0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
18500 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
18510 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18520 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20  Unpacked->flags 
18530 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  & UNPACKED_IGNOR
18540 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65  E_ROWID );.  *re
18550 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
18560 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
18570 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
18580 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18590 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
185a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
185b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
185c0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
185d0 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
185e0 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
185f0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
18600 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
18610 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
18620 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
18630 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
18640 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
18650 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
18660 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
18670 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18680 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
18690 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
186a0 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
186b0 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
186c0 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
186d0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
186e0 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
186f0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
18700 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
18710 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
18720 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
18730 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18740 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
18750 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
18760 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
18770 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
18780 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18790 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
187a0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
187b0 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
187c0 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
187d0 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
187e0 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
187f0 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
18800 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
18810 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
18820 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
18830 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
18840 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
18850 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
18860 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
18870 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
18880 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
18890 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
188a0 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
188b0 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
188c0 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
188d0 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
188e0 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
188f0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
18900 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
18910 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
18920 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
18930 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
18940 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
18950 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
18960 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
18970 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
18980 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
18990 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
189a0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
189b0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
189c0 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
189d0 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
189e0 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
189f0 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
18a00 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
18a10 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
18a20 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
18a30 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
18a40 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
18a50 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
18a60 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
18a70 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
18a80 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
18a90 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
18aa0 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
18ab0 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
18ac0 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
18ad0 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
18ae0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
18af0 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
18b00 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
18b10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
18b20 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
18b30 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
18b40 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
18b50 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
18b60 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
18b70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
18b80 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
18b90 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
18ba0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
18bb0 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
18bc0 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
18bd0 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
18be0 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
18bf0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
18c00 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
18c10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
18c20 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
18c30 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
18c40 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
18c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18c60 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
18c70 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
18c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
18c90 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
18ca0 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
18cb0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
18cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18cd0 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a  StoreType((Mem *
18ce0 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  )pRet);.      }.
18cf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
18d00 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
18d10 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
18d20 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
18d30 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
18d40 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
18d50 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
18d60 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
18d70 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
18d80 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
18d90 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
18da0 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
18db0 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
18dc0 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
18dd0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
18de0 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
18df0 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
18e00 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
18e10 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
18e20 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
18e30 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
18e40 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
18e50 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
18e60 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
18e70 7d 0a 7d 0a                                      }.}.