/ Hex Artifact Content
Login

Artifact 863cd854d343e3e71622f20e5066d3007f9216c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0f60: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0f70: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0f90: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0fa0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0fb0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0fc0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0fd0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0fe0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0ff0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
1000: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1020: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1030: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1050: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1060: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1070: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1080: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1090: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
10a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10b0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
10c0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
10e0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
10f0: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1100: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1110: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1120: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1130: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1140: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1150: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1160: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1170: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1180: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11a0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
11b0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
11c0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
11d0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
11e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1200: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1210: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1230: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1240: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1250: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1260: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1270: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1280: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1290: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
12b0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
12c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
12d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
12f0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1310: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1340: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1350: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1360: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1380: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1390: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
13a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
13b0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
13c0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
13d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13e0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
13f0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1410: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1420: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1430: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1440: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1460: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1470: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1490: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
14a0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
14b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
14c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
14d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
14e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14f0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1500: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1510: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1520: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1540: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1550: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1560: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1570: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1580: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1590: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
15a0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
15b0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
15c0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
15d0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
15e0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
15f0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1600: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1610: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1620: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1630: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1640: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1650: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1660: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1670: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1680: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1690: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
16a0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
16b0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
16c0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
16d0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
16e0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
16f0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1700: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1710: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1720: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1730: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1740: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1750: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1760: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1770: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1780: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1790: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
17a0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
17b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17c0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
17d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
17e0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
17f0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1800: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1810: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1820: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1830: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61    int n = p->nLa
1840: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  belAlloc*2 + 5;.
1850: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1860: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1870: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1880: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  n*sizeof(p->aLab
18c0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e  el[0]));.    p->
18d0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71  nLabelAlloc = sq
18e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18f0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1900: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  el)/sizeof(p->aL
1910: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  abel[0]);.  }.  
1920: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1930: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1940: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1950: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1960: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1970: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1980: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1990: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
19a0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
19b0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
19c0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
19d0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
19e0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
19f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1a00: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1a20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1a30: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1a40: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1a60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1a70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1a80: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1a90: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1aa0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1ab0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1ac0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1ad0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1ae0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1af0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1b00: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1b10: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1b20: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1b30: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1b40: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1b60: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1b70: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1b90: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1ba0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1bb0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1bc0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1bd0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1be0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1bf0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1c00: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1c10: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1c20: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1c30: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1c40: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1c50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c60: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1c70: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1c80: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1c90: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1ca0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1cb0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1ce0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1cf0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1d00: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1d10: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1d20: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1d30: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1d40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1d50: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1d60: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1d70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1d80: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1d90: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1da0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1db0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1dc0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1dd0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1de0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1df0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1e00: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1e10: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1e20: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1e30: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1e60: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1e70: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1e80: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1e90: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1ea0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1eb0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1ee0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1ef0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1f00: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1f10: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
1f20: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
1f30: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
1f40: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
1f50: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
1f60: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
1f70: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
1f80: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
1f90: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
1fa0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
1fb0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
1fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
1fd0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
1fe0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
1ff0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
2000: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2010: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2020: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2030: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2040: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2050: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2060: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2070: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2080: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2090: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
20a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
20b0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
20c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
20d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
20e0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
20f0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
2100: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2110: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2120: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2140: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2150: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2170: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2190: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
21a0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
21b0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
21c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
21d0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
21e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
21f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2210: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2220: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2230: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2250: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2270: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2280: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2290: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22a0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
22b0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
22c0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
22d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22e0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
22f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2300: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2310: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2320: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2330: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2340: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2350: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2370: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2380: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2390: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
23a0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
23b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
23c0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
23d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
23f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2400: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2410: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2420: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2430: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2440: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2450: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2460: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2470: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2480: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2490: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
24a0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
24b0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
24c0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
24d0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
24e0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
24f0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2500: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2520: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2540: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2550: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2560: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2570: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2580: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2590: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
25a0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
25b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
25c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
25d0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
25e0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
25f0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2600: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2610: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2620: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2630: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2640: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2650: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2660: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2670: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2680: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2690: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
26a0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
26b0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
26c0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
26d0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
26e0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
26f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2700: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2710: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2720: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2730: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2740: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2750: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2760: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2770: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2780: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2790: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
27a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
27b0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
27c0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
27d0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
27e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27f0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2800: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2810: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
2820: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2830: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2840: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
2850: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2860: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2870: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2880: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2890: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
28a0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
28b0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
28c0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
28d0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
28e0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
28f0: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2900: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2910: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
2920: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
2930: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
2940: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
2950: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
2960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2970: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2980: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2990: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
29a0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
29b0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
29c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
29d0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
29e0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
29f0: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2a00: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2a10: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
2a20: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
2a30: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
2a40: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
2a50: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
2a60: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
2a70: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2a80: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2a90: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2aa0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2ab0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2ac0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2ad0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2ae0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2af0: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2b00: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2b10: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
2b20: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
2b30: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
2b40: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
2b50: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
2b60: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
2b70: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2b80: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2b90: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2ba0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
2bb0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
2bc0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
2bd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
2be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2bf0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
2c00: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
2c10: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
2c20: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
2c30: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
2c40: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
2c50: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
2c60: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
2c70: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f  adOnly = 1;.  fo
2c80: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2c90: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2ca0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2cb0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2cc0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70  ->opcode;..    p
2cd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71  Op->opflags = sq
2ce0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
2cf0: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20  rty[opcode];.   
2d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2d10: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
2d20: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
2d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2d40: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
2d50: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
2d60: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
2d70: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e   opcode==OP_Tran
2d80: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
2d90: 70 32 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  p2!=0 ){.      p
2da0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
2db0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dc0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2dd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2de0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
2df0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
2e00: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
2e10: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
2e20: 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->p2;.    }else 
2e30: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
2e40: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
2e50: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
2e60: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
2e70: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
2e80: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
2e90: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2ea0: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2eb0: 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-1].p1;.      
2ec0: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2ed0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2ee0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2ef0: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
2f00: 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  gs & OPFLG_JUMP)
2f10: 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  !=0 && pOp->p2<0
2f20: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f30: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
2f40: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
2f50: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
2f60: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
2f70: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2f80: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
2f90: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
2fa0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
2fb0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
2fc0: 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  MaxArgs;.}../*.*
2fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
2fe0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2ff0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3000: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3020: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3030: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3040: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3050: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
3060: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
3070: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3080: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
3090: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
30a0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
30b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
30c0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
30d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
30e0: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
30f0: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3100: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3110: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3120: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3130: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3140: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
3150: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
3160: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
3170: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3180: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
3190: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
31a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
31b0: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
31c0: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
31d0: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
31e0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
31f0: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3200: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3210: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3220: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3230: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3240: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
3250: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
3260: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
3270: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
3280: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
3290: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
32a0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
32b0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
32c0: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
32d0: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
32e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
32f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3300: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3310: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3320: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3330: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3340: 61 4d 75 74 65 78 2e 6e 4d 75 74 65 78 3d 3d 30  aMutex.nMutex==0
3350: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
3360: 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41  Values(p, pnMaxA
3370: 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70  rg);.  *pnOp = p
3380: 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20  ->nOp;.  p->aOp 
3390: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f  = 0;.  return aO
33a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
33b0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
33c0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
33d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
33e0: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
33f0: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
3400: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
3410: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
3420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3430: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
3440: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
3450: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
3460: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
3470: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3480: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3490: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
34a0: 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  nOp > p->nOpAllo
34b0: 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79  c && growOpArray
34c0: 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (p) ){.    retur
34d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
34e0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
34f0: 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b  ALWAYS(nOp>0) ){
3500: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3510: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3520: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
3530: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
3540: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
3550: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
3560: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
3570: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
3580: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
3590: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
35a0: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
35b0: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
35c0: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
35d0: 28 20 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74  ( p2<0 && (sqlit
35e0: 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  e3OpcodeProperty
35f0: 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26  [pOut->opcode] &
3600: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
3610: 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  ){.        pOut-
3620: 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44  >p2 = addr + ADD
3630: 52 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  R(p2);.      }el
3640: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74  se{.        pOut
3650: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20  ->p2 = p2;.     
3660: 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70   }.      pOut->p
3670: 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20  3 = pIn->p3;.   
3680: 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20     pOut->p4type 
3690: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
36a0: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
36b0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   0;.      pOut->
36c0: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
36d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
36e0: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
36f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
3700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
3710: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
3720: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
3730: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
3740: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
3750: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
3760: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
3770: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
3780: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
3790: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
37a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
37b0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
37c0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
37d0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
37e0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
37f0: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
3800: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3810: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
3820: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
3830: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
3840: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
3850: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
3860: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
3870: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
3880: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3890: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69  ngeP1(Vdbe *p, i
38a0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
38b0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
38c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
38d0: 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ddr>=0 );.  if( 
38e0: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20  p->nOp>addr ){. 
38f0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3900: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
3910: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3920: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3930: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
3940: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
3950: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
3960: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
3970: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
3980: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
3990: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
39a0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
39b0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
39c0: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
39d0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
39e0: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
39f0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64    if( p->nOp>add
3a00: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3a10: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
3a20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3a30: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3a40: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
3a50: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3a60: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
3a70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3a80: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
3a90: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
3aa0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3ab0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
3ac0: 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66   addr>=0 );.  if
3ad0: 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b  ( p->nOp>addr ){
3ae0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
3af0: 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p3 = val;.  }.
3b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3b10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3b20: 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P5 operand for 
3b30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3b40: 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61  y.** added opera
3b50: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3b60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3b70: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61  5(Vdbe *p, u8 va
3b80: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
3ba0: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
3bb0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
3bc0: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
3bd0: 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d  1].p5 = val;.  }
3be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3bf0: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
3c00: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
3c10: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
3c20: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
3c30: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
3c40: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
3c50: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
3c60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3c70: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
3c80: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
3c90: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3ca0: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
3cb0: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  Op);.}.../*.** I
3cc0: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
3cd0: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
3ce0: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
3cf0: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
3d00: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
3d10: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
3d20: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
3d30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
3d40: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3d50: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
3d60: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b   FuncDef *pDef){
3d70: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44  .  if( ALWAYS(pD
3d80: 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c  ef) && (pDef->fl
3d90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
3da0: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
3db0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3dc0: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
3dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
3de0: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
3df0: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
3e00: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
3e10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3e20: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
3e30: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20  ){.  if( p4 ){. 
3e40: 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70     switch( p4typ
3e50: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
3e60: 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63  P4_REAL:.      c
3e70: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
3e80: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49      case P4_MPRI
3e90: 4e 54 46 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NTF:.      case 
3ea0: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20  P4_DYNAMIC:.    
3eb0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
3ec0: 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  O:.      case P4
3ed0: 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20  _INTARRAY:.     
3ee0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
3ef0: 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20  _HANDOFF: {.    
3f00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3f10: 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20  e(db, p4);.     
3f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3f30: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
3f40: 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20  VDBEFUNC: {.    
3f50: 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56      VdbeFunc *pV
3f60: 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46  dbeFunc = (VdbeF
3f70: 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20  unc *)p4;.      
3f80: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
3f90: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62  unction(db, pVdb
3fa0: 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20  eFunc->pFunc);. 
3fb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3fc0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
3fd0: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
3fe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
3ff0: 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75  Free(db, pVdbeFu
4000: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
4010: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4020: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
4030: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
4040: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
4050: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
4060: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4070: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4080: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4090: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
40a0: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
40b0: 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a  te3_value*)p4);.
40c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
40d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
40e0: 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20  e P4_VTAB : {.  
40f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
4100: 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20  bUnlock((VTable 
4110: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
4120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4130: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
4140: 52 4f 47 52 41 4d 20 3a 20 7b 0a 20 20 20 20 20  ROGRAM : {.     
4150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4160: 6f 67 72 61 6d 44 65 6c 65 74 65 28 64 62 2c 20  ogramDelete(db, 
4170: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 29 70 34  (SubProgram *)p4
4180: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
4190: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
41a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
41b0: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
41c0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
41d0: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
41e0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
41f0: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
4200: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
4210: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
4220: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
4230: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
4240: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
4250: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
4260: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
4270: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
4280: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
4290: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
42a0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
42b0: 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61  (pOp=aOp; pOp<&a
42c0: 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b  Op[nOp]; pOp++){
42d0: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
42e0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
42f0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
4300: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4310: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4320: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
4330: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
4340: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73    .    }.  }.  s
4350: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4360: 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOp);.}../*.** 
4370: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
4380: 66 2d 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 53  f-count on the S
4390: 75 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74  ubProgram struct
43a0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
43b0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75  e.** second argu
43c0: 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 72 65 66  ment. If the ref
43d0: 2d 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a  -count reaches z
43e0: 65 72 6f 2c 20 66 72 65 65 20 74 68 65 20 73 74  ero, free the st
43f0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
4400: 68 65 20 61 72 72 61 79 20 6f 66 20 56 44 42 45  he array of VDBE
4410: 20 6f 70 63 6f 64 65 73 20 73 74 6f 72 65 64 20   opcodes stored 
4420: 61 73 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f  as SubProgram.aO
4430: 70 20 69 73 20 66 72 65 65 64 20 69 66 0a 2a 2a  p is freed if.**
4440: 20 65 69 74 68 65 72 20 74 68 65 20 72 65 66 2d   either the ref-
4450: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
4460: 72 6f 20 6f 72 20 70 61 72 61 6d 65 74 65 72 20  ro or parameter 
4470: 66 72 65 65 6f 70 20 69 73 20 6e 6f 6e 2d 7a 65  freeop is non-ze
4480: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ro..**.** Since 
4490: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
44a0: 6f 64 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  odes pointed to 
44b0: 62 79 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f  by SubProgram.aO
44c0: 70 20 6d 61 79 20 64 69 72 65 63 74 6c 79 0a 2a  p may directly.*
44d0: 2a 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 20  * or indirectly 
44e0: 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65  contain a refere
44f0: 6e 63 65 20 74 6f 20 74 68 65 20 53 75 62 50 72  nce to the SubPr
4500: 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72 65 20  ogram structure 
4510: 69 74 73 65 6c 66 2e 0a 2a 2a 20 42 79 20 70 61  itself..** By pa
4520: 73 73 69 6e 67 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ssing a non-zero
4530: 20 66 72 65 65 6f 70 20 70 61 72 61 6d 65 74 65   freeop paramete
4540: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61  r, the caller ma
4550: 79 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c  y ensure that al
4560: 6c 0a 2a 2a 20 53 75 62 50 72 6f 67 72 61 6d 20  l.** SubProgram 
4570: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
4580: 68 65 69 72 20 61 4f 70 20 61 72 72 61 79 73 20  heir aOp arrays 
4590: 61 72 65 20 66 72 65 65 64 2c 20 65 76 65 6e 20  are freed, even 
45a0: 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  when there.** ar
45b0: 65 20 73 75 63 68 20 63 69 72 63 75 6c 61 72 20  e such circular 
45c0: 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2f 0a 76  references..*/.v
45d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
45e0: 72 6f 67 72 61 6d 44 65 6c 65 74 65 28 73 71 6c  rogramDelete(sql
45f0: 69 74 65 33 20 2a 64 62 2c 20 53 75 62 50 72 6f  ite3 *db, SubPro
4600: 67 72 61 6d 20 2a 70 2c 20 69 6e 74 20 66 72 65  gram *p, int fre
4610: 65 6f 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  eop){.  if( p ){
4620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
4630: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 69 66  nRef>0 );.    if
4640: 28 20 66 72 65 65 6f 70 20 7c 7c 20 70 2d 3e 6e  ( freeop || p->n
4650: 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
4660: 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *aOp = p->aOp
4670: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 20 3d  ;.      p->aOp =
4680: 20 30 3b 0a 20 20 20 20 20 20 76 64 62 65 46 72   0;.      vdbeFr
4690: 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 61 4f  eeOpArray(db, aO
46a0: 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  p, p->nOp);.    
46b0: 20 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20    p->nOp = 0;.  
46c0: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d    }.    p->nRef-
46d0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
46e0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ef==0 ){.      s
46f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4700: 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   p);.    }.  }.}
4710: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
4720: 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69  N opcodes starti
4730: 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f  ng at addr to No
4740: 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  -ops..*/.void sq
4750: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
4760: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
4770: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b  nt addr, int N){
4780: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
4790: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
47a0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
47b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
47c0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77  b = p->db;.    w
47d0: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
47e0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
47f0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
4800: 70 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  p4.p);.      mem
4810: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
4820: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
4830: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
4840: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
4850: 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pOp++;.    }.  }
4860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4870: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4880: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
4890: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
48a0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
48b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
48c0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
48d0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
48e0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
48f0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
4900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
4910: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
4920: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
4930: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
4940: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
4950: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
4960: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
4970: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
4980: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
4990: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
49a0: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
49b0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
49c0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
49d0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
49e0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
49f0: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
4a00: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
4a10: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
4a20: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
4a30: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
4a40: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
4a50: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f  .**.** If n==P4_
4a60: 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73  KEYINFO it means
4a70: 20 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70   that zP4 is a p
4a80: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
4a90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
4aa0: 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65  * A copy is made
4ab0: 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   of the KeyInfo 
4ac0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d  structure into m
4ad0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4ae0: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
4af0: 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65  alloc, to be fre
4b00: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
4b10: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a   is finalized..*
4b20: 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  * n==P4_KEYINFO_
4b30: 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65  HANDOFF indicate
4b40: 73 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  s that zP4 point
4b50: 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  s to a KeyInfo s
4b60: 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72  tructure.** stor
4b70: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61  ed in memory tha
4b80: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
4b90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4ba0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54  qlite3_malloc. T
4bb0: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
4bc0: 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68  ould not free th
4bd0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74  e allocation, it
4be0: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77   will be freed w
4bf0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a  hen the Vdbe is.
4c00: 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  ** finalized..**
4c10: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
4c20: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
4c30: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
4c40: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
4c50: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
4c60: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
4c70: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
4c80: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
4c90: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
4ca0: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
4cb0: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
4cc0: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
4cd0: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
4ce0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
4cf0: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
4d00: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
4d10: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
4d20: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
4d30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4d40: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
4d50: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
4d60: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
4d70: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
4d80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
4d90: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
4da0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
4db0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4dc0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
4dd0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  IT );.  if( p->a
4de0: 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op==0 || db->mal
4df0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
4e00: 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49   if ( n!=P4_KEYI
4e10: 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41  NFO && n!=P4_VTA
4e20: 42 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  B ) {.      free
4e30: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
4e40: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
4e50: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4e60: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
4e70: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
4e80: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
4e90: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
4ea0: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
4eb0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
4ec0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
4ed0: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
4ee0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
4ef0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
4f00: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
4f10: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
4f20: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
4f30: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
4f40: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
4f50: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
4f60: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
4f70: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
4f80: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
4f90: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
4fa0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
4fb0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
4fc0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
4fd0: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
4fe0: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
4ff0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5000: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
5010: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5020: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
5030: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
5040: 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
5050: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  KeyInfo;.    int
5060: 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a   nField, nByte;.
5070: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
5080: 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e  KeyInfo*)zP4)->n
5090: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
50a0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
50b0: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
50c0: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
50d0: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e  o->aColl[0]) + n
50e0: 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49  Field;.    pKeyI
50f0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nfo = sqlite3Mal
5100: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
5110: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
5120: 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
5130: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
5140: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f  ){.      u8 *aSo
5150: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d  rtOrder;.      m
5160: 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 4b 65  emcpy((char*)pKe
5170: 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74  yInfo, zP4, nByt
5180: 65 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f  e);.      aSortO
5190: 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
51a0: 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  >aSortOrder;.   
51b0: 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65     if( aSortOrde
51c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  r ){.        pKe
51d0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
51e0: 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  r = (unsigned ch
51f0: 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  ar*)&pKeyInfo->a
5200: 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20  Coll[nField];.  
5210: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65        memcpy(pKe
5220: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
5230: 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e  r, aSortOrder, n
5240: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Field);.      }.
5250: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
5260: 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P4_KEYINFO;.
5270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5280: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5290: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
52a0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
52b0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a  _NOTUSED;.    }.
52c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
52d0: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
52e0: 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  F ){.    pOp->p4
52f0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
5300: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5310: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
5320: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
5330: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70  _VTAB ){.    pOp
5340: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
5350: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
5360: 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a  type = P4_VTAB;.
5370: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c      sqlite3VtabL
5380: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  ock((VTable *)zP
5390: 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  4);.    assert( 
53a0: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d  ((VTable *)zP4)-
53b0: 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  >db==p->db );.  
53c0: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
53d0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
53e0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
53f0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
5400: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
5410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
5420: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
5430: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
5440: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
5450: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
5460: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
5470: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5480: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
5490: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
54a0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  DEBUG./*.** Chan
54b0: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
54c0: 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72  n the the most r
54d0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
54e0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
54f0: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
5500: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
5510: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
5520: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
5530: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
5540: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
5550: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
5560: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
5570: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
5580: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
5590: 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  build..*/.void s
55a0: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
55b0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
55c0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
55d0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
55e0: 61 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72  ap;.  if( !p ) r
55f0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
5600: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
5610: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
5620: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
5630: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5640: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
5650: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5660: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5670: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72  >nOp ){.    char
5680: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b   **pz = &p->aOp[
5690: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
56a0: 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  nt;.    va_start
56b0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
56c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
56d0: 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20  (p->db, *pz);.  
56e0: 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56    *pz = sqlite3V
56f0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5700: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
5710: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5720: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5730: 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56  dbeNoopComment(V
5740: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
5750: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
5760: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
5770: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
5780: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rn;.  sqlite3Vdb
5790: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
57a0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  op);.  assert( p
57b0: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
57c0: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
57d0: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
57e0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
57f0: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
5800: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5810: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
5820: 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  Op ){.    char *
5830: 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  *pz = &p->aOp[p-
5840: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5850: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
5860: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
5870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
5880: 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20  ->db, *pz);.    
5890: 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  *pz = sqlite3VMP
58a0: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
58b0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
58c0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
58d0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
58e0: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UG */../*.** Ret
58f0: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
5900: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
5910: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
5920: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
5930: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
5940: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5950: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
5960: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
5970: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
5980: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
5990: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
59a0: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
59b0: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
59c0: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
59d0: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
59e0: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
59f0: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
5a00: 61 62 6c 65 20 61 6e 64 20 77 72 69 74 61 62 6c  able and writabl
5a10: 65 2c 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f  e, but it has no
5a20: 20 65 66 66 65 63 74 2e 20 20 54 68 65 20 72 65   effect.  The re
5a30: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 0a  turn of a dummy.
5a40: 2a 2a 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73  ** opcode allows
5a50: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e   the call to con
5a60: 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e  tinue functionin
5a70: 67 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  g after a OOM fa
5a80: 75 6c 74 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  ult without.** h
5a90: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
5aa0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
5ab0: 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  urn from this ro
5ac0: 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64  utine is a valid
5ad0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
5ae0: 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66  About the #ifdef
5af0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5b00: 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  CE:  Normally, t
5b10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
5b20: 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75  ever called.** u
5b30: 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20  nless p->nOp>0. 
5b40: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
5b50: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20   in the absense 
5b60: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  of SQLITE_OMIT_T
5b70: 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54  RACE,.** an OP_T
5b80: 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  race instruction
5b90: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72   is always inser
5ba0: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  ted by sqlite3Vd
5bb0: 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20  beGet() as soon 
5bc0: 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45  as.** a new VDBE
5bd0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f   is created.  So
5be0: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20   we are free to 
5bf0: 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e  set addr to p->n
5c00: 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20  Op-1 without.** 
5c10: 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65  having to double
5c20: 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73  -check to make s
5c30: 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73  ure that the res
5c40: 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  ult is non-negat
5c50: 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53  ive. But.** if S
5c60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5c70: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
5c80: 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69   OP_Trace is omi
5c90: 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e  tted and we do n
5ca0: 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  eed to.** check 
5cb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
5cc0: 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e  nOp-1 before con
5cd0: 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65  tinuing..*/.Vdbe
5ce0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
5cf0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
5d00: 74 20 61 64 64 72 29 7b 0a 20 20 73 74 61 74 69  t addr){.  stati
5d10: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 0a  c VdbeOp dummy;.
5d20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5d30: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5d40: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
5d50: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
5d60: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
5d70: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
5d80: 30 20 29 20 72 65 74 75 72 6e 20 26 64 75 6d 6d  0 ) return &dumm
5d90: 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64  y;.#endif.    ad
5da0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5db0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
5dc0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
5dd0: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
5de0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5df0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
5e00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
5e10: 20 20 20 72 65 74 75 72 6e 20 26 64 75 6d 6d 79     return &dummy
5e20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5e30: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
5e40: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
5e50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5e60: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c  OMIT_EXPLAIN) ||
5e70: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
5e80: 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69  ) \.     || defi
5e90: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
5ea0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
5eb0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
5ec0: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
5ed0: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
5ee0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
5ef0: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
5f00: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
5f10: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
5f20: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
5f30: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
5f40: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34   char *displayP4
5f50: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
5f60: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
5f70: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d  ){.  char *zP4 =
5f80: 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74   zTemp;.  assert
5f90: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
5fa0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34   switch( pOp->p4
5fb0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
5fc0: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
5fd0: 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  IC:.    case P4_
5fe0: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
5ff0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
6000: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
6010: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
6020: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c  yInfo;.      sql
6030: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6040: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79  emp, zTemp, "key
6050: 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e  info(%d", pKeyIn
6060: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
6070: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
6080: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
6090: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
60a0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
60b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
60c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
60d0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
60e0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
60f0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
6100: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
6110: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c  te3Strlen30(pCol
6120: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
6130: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
6140: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
6150: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
6160: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
6170: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
6180: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
6190: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
61a0: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
61b0: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
61c0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
61d0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
61e0: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
61f0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
6200: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
6210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6220: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
6230: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
6240: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
6250: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
6260: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
6270: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
6280: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
6290: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
62a0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
62b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
62c0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
62d0: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
62e0: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
62f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
6300: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
6310: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6320: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
6330: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
6340: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
6350: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
6360: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6370: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
6380: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
6390: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
63a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
63b0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
63c0: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
63d0: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
63e0: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
63f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6400: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6410: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
6420: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
6430: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
6440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6450: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
6460: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6470: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6480: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
6490: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
64a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
64b0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
64c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
64d0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
64e0: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
64f0: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
6500: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6510: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
6520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6530: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6540: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
6550: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
6560: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6570: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
6580: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
6590: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
65a0: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
65b0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
65c0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
65d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
65e0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
65f0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
6600: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
6610: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
6620: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
6630: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
6640: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6650: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
6660: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
6670: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6680: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6690: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
66a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
66b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
66c0: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
66d0: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
66e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
66f0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6700: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
6710: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
6720: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
6730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
6740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6750: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
6760: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
6770: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6780: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
6790: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
67a0: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
67b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
67c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a  p, zTemp, "vtab:
67d0: 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70  %p:%p", pVtab, p
67e0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a  Vtab->pModule);.
67f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6800: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
6810: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
6820: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6830: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6840: 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79  zTemp, "intarray
6850: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
6860: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6870: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b  P4_SUBPROGRAM: {
6880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6890: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
68a0: 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29  Temp, "program")
68b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
68c0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
68d0: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
68e0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
68f0: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
6900: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
6910: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
6920: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
6930: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
6940: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
6950: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
6960: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
6970: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
6980: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
6990: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
69a0: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
69b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
69c0: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
69d0: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69   *p, int i){.  i
69e0: 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72  nt mask;.  asser
69f0: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
6a00: 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69 7a  db->nDb && i<siz
6a10: 65 6f 66 28 75 33 32 29 2a 38 20 29 3b 0a 20 20  eof(u32)*8 );.  
6a20: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
6a30: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
6a40: 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20  sk)*8 );.  mask 
6a50: 3d 20 28 28 75 33 32 29 31 29 3c 3c 69 3b 0a 20  = ((u32)1)<<i;. 
6a60: 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61   if( (p->btreeMa
6a70: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
6a80: 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  .    p->btreeMas
6a90: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73  k |= mask;.    s
6aa0: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
6ab0: 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e  ArrayInsert(&p->
6ac0: 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61  aMutex, p->db->a
6ad0: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a  Db[i].pBt);.  }.
6ae0: 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  }...#if defined(
6af0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
6b00: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6b10: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
6b20: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
6b30: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
6b40: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
6b50: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
6b60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6b70: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
6b80: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
6b90: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
6ba0: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
6bb0: 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  50];.  static co
6bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
6bd0: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
6be0: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73  %4d %4d %4d %-4s
6bf0: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
6c00: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
6c10: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
6c20: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
6c30: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
6c40: 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74  zPtr));.  fprint
6c50: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
6c60: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
6c70: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
6c80: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
6c90: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
6ca0: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
6cb0: 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c  ->p5,.#ifdef SQL
6cc0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
6cd0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20  pOp->zComment ? 
6ce0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20  pOp->zComment : 
6cf0: 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  "".#else.      "
6d00: 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  ".#endif.  );.  
6d10: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
6d20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
6d30: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
6d40: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
6d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6d60: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
6d70: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
6d80: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
6d90: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20      Mem *pEnd;. 
6da0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
6db0: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
6dc0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
6dd0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
6de0: 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70  .    for(pEnd=&p
6df0: 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [N]; p<pEnd; p++
6e00: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
6e10: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
6e20: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
6e30: 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  db );..      /* 
6e40: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
6e50: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
6e60: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
6e70: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
6e80: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
6e90: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
6ea0: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
6eb0: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
6ec0: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
6ed0: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
6ee0: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
6ef0: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
6f00: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
6f10: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
6f20: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
6f30: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
6f40: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
6f50: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
6f60: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
6f70: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
6f80: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
6f90: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
6fa0: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
6fb0: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
6fc0: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
6fd0: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
6fe0: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
6ff0: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
7000: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
7010: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
7020: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
7030: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
7040: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
7050: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
7060: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
7070: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
7080: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
7090: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
70a0: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
70b0: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
70c0: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
70d0: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
70e0: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
70f0: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
7100: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
7110: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
7120: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
7130: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
7140: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
7150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
7160: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
7170: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
7180: 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >zMalloc ){.    
7190: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
71a0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
71b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d  );.        p->zM
71c0: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
71d0: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
71e0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
71f0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
7200: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
7210: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
7220: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
7230: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7240: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
7250: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
7260: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
7270: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
7280: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
7290: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
72a0: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
72b0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
72c0: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
72d0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
72e0: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
72f0: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
7300: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
7310: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
7320: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
7330: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
7340: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
7350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
7360: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7370: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
7380: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7390: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
73a0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
73b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
73c0: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
73d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
73e0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
73f0: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
7400: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
7410: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
7420: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
7430: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
7440: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
7450: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
7460: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
7470: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
7480: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
7490: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
74a0: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
74b0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
74c0: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
74d0: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
74e0: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
74f0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
7500: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
7510: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
7520: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
7530: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
7540: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
7550: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
7560: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
7570: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
7580: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
7590: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
75a0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
75b0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
75c0: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
75d0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
75e0: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
75f0: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
7600: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
7610: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
7620: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
7630: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
7640: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7650: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
7680: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
76b0: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
76c0: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
76d0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
76e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
76f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7700: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
7710: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
7720: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
7730: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
7740: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
7750: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
7760: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
7790: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
77a0: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
77b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
77c0: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
77d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
77e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
77f0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7820: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
7830: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7840: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
7850: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7860: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
7870: 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74  Mem = p->pResult
7880: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
7890: 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d  ];  /* First Mem
78a0: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
78b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
78c0: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
78d0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
78e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
78f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
7900: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
7910: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
7920: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
7930: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
7940: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
7950: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
7960: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
7970: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
7980: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
7990: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
79a0: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
79b0: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
79c0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
79d0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
79e0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
79f0: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
7a00: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
7a10: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
7a20: 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20  Mem, 8);..  if( 
7a30: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
7a40: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
7a50: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
7a60: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
7a70: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
7a80: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
7a90: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
7aa0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
7ab0: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
7ac0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
7ad0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
7ae0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
7af0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
7b00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
7b10: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
7b20: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
7b30: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
7b40: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
7b50: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
7b60: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
7b70: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
7b80: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
7b90: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
7ba0: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
7bb0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
7bc0: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
7bd0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
7be0: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
7bf0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
7c00: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
7c10: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
7c20: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
7c30: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
7c40: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
7c50: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
7c60: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
7c70: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
7c80: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
7c90: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
7ca0: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
7cb0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
7cc0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
7cd0: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
7ce0: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
7cf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
7d00: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
7d10: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
7d20: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
7d30: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
7d40: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
7d50: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
7d60: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
7d70: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
7d80: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
7d90: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
7da0: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
7db0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
7dc0: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
7dd0: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
7de0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
7df0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
7e00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
7e10: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
7e20: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
7e30: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
7e40: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
7e50: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
7e60: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
7e70: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
7e80: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
7e90: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
7ea0: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
7eb0: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
7ec0: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
7ed0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
7ee0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
7ef0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
7f00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
7f10: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
7f20: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
7f30: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
7f40: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
7f50: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
7f60: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
7f70: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
7f80: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
7f90: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
7fa0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
7fb0: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
7fc0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
7fd0: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
7fe0: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
7ff0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8000: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
8010: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8020: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
8030: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
8040: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
8050: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
8060: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
8070: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
8080: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
8090: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
80a0: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
80b0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
80c0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
80d0: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
80e0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
80f0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
8100: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
8110: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
8120: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
8130: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
8140: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
8150: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
8160: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
8170: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
8180: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
8190: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
81a0: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
81b0: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
81c0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
81d0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
81e0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
81f0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
8200: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
8210: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
8220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8230: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8240: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8250: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8260: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8270: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8280: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
8290: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
82c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
82d0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
82e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
82f0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
8300: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8310: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
8320: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
8330: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8340: 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e);  /* Opcode *
8350: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8360: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
8370: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
8380: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
8390: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
83a0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
83b0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
83c0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
83d0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
83e0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
83f0: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
8400: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
8410: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
8420: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
8430: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
8440: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
8450: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
8460: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
8470: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
8480: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
8490: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
84a0: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
84b0: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
84c0: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
84d0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
84e0: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
84f0: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
8500: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
8510: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
8520: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
8530: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
8540: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
8550: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
8560: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
8570: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
8580: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
8590: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
85a0: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
85b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
85c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
85d0: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
85e0: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
85f0: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
8600: 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  te, 1) ){.      
8610: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
8620: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
8630: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
8640: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
8650: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
8660: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
8670: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
8680: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
8690: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
86a0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
86b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
86c0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
86d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
86e0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
86f0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
8720: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8730: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8740: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
8750: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8760: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
8770: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32  m->u.i = pOp->p2
8780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32             /* P2
87a0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
87b0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
87c0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
87d0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
87e0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
87f0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
8800: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
8810: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
8820: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
8830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8840: 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  3 */.      pMem-
8850: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
8860: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d  NTEGER;.      pM
8870: 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  em++;.    }..   
8880: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
8890: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32  MemGrow(pMem, 32
88a0: 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20  , 0) ){         
88b0: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
88c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
88d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
88e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
88f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8900: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  }.    pMem->flag
8910: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
8920: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
8930: 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28    z = displayP4(
8940: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32  pOp, pMem->z, 32
8950: 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d  );.    if( z!=pM
8960: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73  em->z ){.      s
8970: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
8980: 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c  Str(pMem, z, -1,
8990: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
89a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
89b0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
89c0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
89d0: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
89e0: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
89f0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
8a00: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
8a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
8a20: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8a30: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  TEXT;.    pMem++
8a40: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
8a50: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
8a60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
8a70: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34  eMemGrow(pMem, 4
8a80: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
8a90: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
8aa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8ac0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8ad0: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
8ae0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
8af0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
8b00: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8b10: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
8b20: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
8b30: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
8b40: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
8b50: 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  5 */.      pMem-
8b60: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
8b70: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
8b80: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
8b90: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
8ba0: 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.  .#ifdef SQLI
8bb0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69  TE_DEBUG.      i
8bc0: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
8bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
8be0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
8bf0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
8c00: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f      pMem->z = pO
8c10: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  p->zComment;.   
8c20: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
8c30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
8c40: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
8c50: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
8c60: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
8c70: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
8c80: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
8c90: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8ca0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
8cb0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8cc0: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ce0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  Comment */.     
8cf0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
8d00: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20  SQLITE_NULL;.   
8d10: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8d20: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
8d30: 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 5*(p->explai
8d40: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  n-1);.    p->rc 
8d50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8d60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
8d70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8d80: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
8d90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
8da0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
8db0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
8dc0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
8dd0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
8de0: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
8df0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
8e00: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
8e10: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
8e20: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
8e30: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
8e40: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
8e50: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
8e60: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
8e70: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
8e80: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
8e90: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63  p4.z!=0 ){.    c
8ea0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
8eb0: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68  Op->p4.z;.    wh
8ec0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
8ed0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
8ee0: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
8ef0: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
8f00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
8f10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8f20: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
8f30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8f40: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
8f50: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
8f60: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
8f70: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
8f80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8f90: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
8fa0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
8fb0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
8fc0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
8fd0: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
8fe0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8ff0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
9000: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
9010: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
9020: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
9030: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
9040: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
9050: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
9060: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
9070: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
9080: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
9090: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
90a0: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
90b0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
90c0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
90d0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
90e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
90f0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
9100: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
9110: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
9120: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
9130: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
9140: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9150: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
9160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9170: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
9180: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
9190: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
91a0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
91b0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
91c0: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
91d0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
91e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
91f0: 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78  space from a fix
9200: 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61  ed size buffer a
9210: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
9220: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
9230: 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66  pace.  If insuff
9240: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20  icient space is 
9250: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
9260: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
9270: 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72  e pBuf parameter
9280: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
9290: 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74  value of a point
92a0: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  er which will.**
92b0: 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77   receive the new
92c0: 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69   memory.  pBuf i
92d0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e  s normally NULL.
92e0: 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74    If pBuf is not
92f0: 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  .** NULL, it mea
9300: 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73  ns that memory s
9310: 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79  pace has already
9320: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
9330: 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  and that.** this
9340: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
9350: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79  not allocate any
9360: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68   new memory.  Wh
9370: 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  en pBuf is not.*
9380: 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65  * NULL simply re
9390: 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79  turn pBuf.  Only
93a0: 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65   allocate new me
93b0: 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20  mory space when 
93c0: 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  pBuf.** is NULL.
93d0: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20  .**.** nByte is 
93e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
93f0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65  tes of space nee
9400: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72  ded..**.** *ppFr
9410: 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61  om points to ava
9420: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
9430: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
9440: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
9450: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
9460: 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69  e.  When space i
9470: 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70  s allocated, *pp
9480: 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64  From is advanced
9490: 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64   past.** the end
94a0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
94b0: 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a  d space..**.** *
94c0: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e  pnByte is a coun
94d0: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
94e0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
94f0: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61  ace that have fa
9500: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63  iled.** to alloc
9510: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ate.  If there i
9520: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  s insufficient s
9530: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20  pace in *ppFrom 
9540: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
9550: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
9560: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
9570: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
9580: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  of the request..
9590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
95a0: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f  allocSpace(.  vo
95b0: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
95c0: 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75     /* Where retu
95d0: 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20  rn pointer will 
95e0: 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  be stored */.  i
95f0: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
9600: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9610: 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   bytes to alloca
9620: 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46  te */.  u8 **ppF
9630: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rom,         /* 
9640: 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  IN/OUT: Allocate
9650: 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f   from *ppFrom */
9660: 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20  .  u8 *pEnd,    
9670: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9680: 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73  er to 1 byte pas
9690: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70  t the end of *pp
96a0: 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20  From buffer */. 
96b0: 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20   int *pnByte    
96c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f        /* If allo
96d0: 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  cation cannot be
96e0: 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74   made, increment
96f0: 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20   *pnByte */.){. 
9700: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
9710: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70  YTE_ALIGNMENT(*p
9720: 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20  pFrom) );.  if( 
9730: 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42  pBuf ) return pB
9740: 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  uf;.  nByte = RO
9750: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69  UND8(nByte);.  i
9760: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42  f( &(*ppFrom)[nB
9770: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a  yte] <= pEnd ){.
9780: 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
9790: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a  *)*ppFrom;.    *
97a0: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b  ppFrom += nByte;
97b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
97c0: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a  nByte += nByte;.
97d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75    }.  return pBu
97e0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  f;.}../*.** Prep
97f0: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
9800: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
9810: 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ion.  This invol
9820: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
9830: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
9840: 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64   stack space and
9850: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
9860: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
9870: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
9880: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
9890: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
98a0: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
98b0: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
98c0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
98d0: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
98e0: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  is is the only w
98f0: 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42  ay to move a VDB
9900: 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  E from VDBE_MAGI
9910: 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42  C_INIT to.** VDB
9920: 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a  E_MAGIC_RUN..**.
9930: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9940: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6d   may be called m
9950: 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e  ore than once on
9960: 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61   a single virtua
9970: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68  l machine..** Th
9980: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69 73 20  e first call is 
9990: 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d 70 69  made while compi
99a0: 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74 61  ling the SQL sta
99b0: 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71 75 65  tement. Subseque
99c0: 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20  nt.** calls are 
99d0: 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f 66 20  made as part of 
99e0: 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 72  the process of r
99f0: 65 73 65 74 74 69 6e 67 20 61 20 73 74 61 74 65  esetting a state
9a00: 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65  ment to be.** re
9a10: 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f 6d 20  -executed (from 
9a20: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
9a30: 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68 65 20  3_reset()). The 
9a40: 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72  nVar, nMem, nCur
9a50: 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78  sor .** and isEx
9a60: 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65 72 73  plain parameters
9a70: 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73 65 64   are only passed
9a80: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 73 20   correct values 
9a90: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a  the first time.*
9aa0: 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  * the function i
9ab0: 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62  s called. On sub
9ac0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66  sequent calls, f
9ad0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  rom sqlite3_rese
9ae0: 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20  t(), nVar.** is 
9af0: 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d  passed -1 and nM
9b00: 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e 64 20  em, nCursor and 
9b10: 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20 61 6c  isExplain are al
9b20: 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a  l passed zero..*
9b30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9b40: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
9b50: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b70: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69   The VDBE */.  i
9b80: 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20  nt nVar,        
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73   Number of '?' s
9bb0: 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ee in the SQL st
9bc0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
9bd0: 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20   nMem,          
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9bf0: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
9c00: 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  cells to allocat
9c10: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  e */.  int nCurs
9c20: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
9c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9c40: 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  of cursors to al
9c50: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
9c60: 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
9c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
9c80: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
9c90: 61 72 67 73 20 69 6e 20 53 75 62 50 72 6f 67 72  args in SubProgr
9ca0: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ams */.  int isE
9cb0: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20  xplain,         
9cc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9cd0: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
9ce0: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
9cf0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73  nt */.  int uses
9d00: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20  StmtJournal     
9d10: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
9d20: 6f 20 73 65 74 20 56 64 62 65 2e 75 73 65 73 53  o set Vdbe.usesS
9d30: 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b  tmtJournal */.){
9d40: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
9d50: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
9d60: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
9d70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9d80: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
9d90: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
9da0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
9db0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
9dc0: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
9dd0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
9de0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
9df0: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
9e00: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
9e10: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
9e20: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
9e30: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
9e40: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
9e50: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
9e60: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
9e70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
9e80: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
9e90: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
9ea0: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
9eb0: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
9ec0: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
9ed0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
9ee0: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
9ef0: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
9f00: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
9f10: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
9f20: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
9f30: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
9f40: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
9f50: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
9f60: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
9f70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
9f80: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
9f90: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
9fa0: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
9fb0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
9fc0: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
9fd0: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
9fe0: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
9ff0: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
a000: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
a010: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
a020: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
a030: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
a040: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
a050: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
a060: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
a070: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
a080: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
a090: 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  n. This is only 
a0a0: 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  done the.  ** fi
a0b0: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 66 75  rst time this fu
a0c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a0d0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 56 44 42   for a given VDB
a0e0: 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74 20 69  E, not when it i
a0f0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c  s.  ** being cal
a100: 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  led from sqlite3
a110: 5f 72 65 73 65 74 28 29 20 74 6f 20 72 65 73 65  _reset() to rese
a120: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  t the virtual ma
a130: 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  chine..  */.  if
a140: 28 20 6e 56 61 72 3e 3d 30 20 26 26 20 41 4c 57  ( nVar>=0 && ALW
a150: 41 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  AYS(db->mallocFa
a160: 69 6c 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20  iled==0) ){.    
a170: 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a  u8 *zCsr = (u8 *
a180: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  )&p->aOp[p->nOp]
a190: 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72  ;       /* Memor
a1a0: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20  y avaliable for 
a1b0: 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  alloation */.   
a1c0: 20 75 38 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20   u8 *zEnd = (u8 
a1d0: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  *)&p->aOp[p->nOp
a1e0: 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73  Alloc];  /* Firs
a1f0: 74 20 62 79 74 65 20 70 61 73 74 20 61 76 61 69  t byte past avai
a200: 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 20  lable mem */.   
a210: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
a240: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
a250: 79 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 20  y needed */..   
a260: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
a270: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20  (p, &nArg);.    
a280: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
a290: 61 6c 20 3d 20 28 75 38 29 75 73 65 73 53 74 6d  al = (u8)usesStm
a2a0: 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 69 66  tJournal;.    if
a2b0: 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e  ( isExplain && n
a2c0: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20  Mem<10 ){.      
a2d0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d  nMem = 10;.    }
a2e0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73 72  .    memset(zCsr
a2f0: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
a300: 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43  .    zCsr += (zC
a310: 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a  sr - (u8*)0)&7;.
a320: 20 20 20 20 61 73 73 65 72 74 28 20 45 49 47 48      assert( EIGH
a330: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
a340: 28 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20 20 2f  (zCsr) );..    /
a350: 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
a360: 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
a370: 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
a380: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
a390: 20 74 77 6f 0a 20 20 20 20 2a 2a 20 70 61 73 73   two.    ** pass
a3a0: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
a3b0: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
a3c0: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73  o reuse unused s
a3d0: 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 20  pace at the .   
a3e0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
a3f0: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
a400: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
a410: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
a420: 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 72 65 71 75  mory.    ** requ
a430: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
a440: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
a450: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
a460: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
a470: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
a480: 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69   in the rest usi
a490: 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63  ng a fresh alloc
a4a0: 61 74 69 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a  ation.  .    **.
a4b0: 20 20 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d      ** This two-
a4c0: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
a4d0: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
a4e0: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
a4f0: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ible from.    **
a500: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70   the leftover sp
a510: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
a520: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
a530: 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  ay can significa
a540: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 72 65 64 75  ntly.    ** redu
a550: 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ce the amount of
a560: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
a570: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
a580: 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
a590: 20 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42 79 74   do {.      nByt
a5a0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
a5b0: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
a5c0: 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  e(p->aMem, nMem*
a5d0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
a5e0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
a5f0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  );.      p->aVar
a600: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
a610: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
a620: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
a630: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
a640: 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20       p->apArg = 
a650: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
a660: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
a670: 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  (Mem*), &zCsr, z
a680: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
a690: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61      p->azVar = a
a6a0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56  llocSpace(p->azV
a6b0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
a6c0: 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  char*), &zCsr, z
a6d0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
a6e0: 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61      p->apCsr = a
a6f0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43  llocSpace(p->apC
a700: 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65  sr, nCursor*size
a710: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c  of(VdbeCursor*),
a720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43               &zC
a740: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
a750: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79  );.      if( nBy
a760: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  te ){.        p-
a770: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
a780: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a790: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d   nByte);.      }
a7a0: 0a 20 20 20 20 20 20 7a 43 73 72 20 3d 20 70 2d  .      zCsr = p-
a7b0: 3e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 7a 45  >pFree;.      zE
a7c0: 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65  nd = &zCsr[nByte
a7d0: 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 6e  ];.    }while( n
a7e0: 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c  Byte && !db->mal
a7f0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
a800: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28    p->nCursor = (
a810: 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20  u16)nCursor;.   
a820: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a   if( p->aVar ){.
a830: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
a840: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
a850: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
a860: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
a870: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
a880: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
a890: 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e         p->aVar[n
a8a0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
a8b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a8c0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
a8d0: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20    p->aMem--;    
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
a900: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
a910: 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  .      p->nMem =
a920: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
a930: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
a940: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
a950: 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  -1 */.      for(
a960: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
a970: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
a980: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
a990: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  EM_Null;.       
a9a0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
a9b0: 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   db;.      }.   
a9c0: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
a9d0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
a9e0: 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b  (n=1; n<p->nMem;
a9f0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   n++){.    asser
aa00: 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62  t( p->aMem[n].db
aa10: 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ==db );.  }.#end
aa20: 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  if..  p->pc = -1
aa30: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
aa40: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
aa50: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
aa60: 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e  rt;.  p->explain
aa70: 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20   |= isExplain;. 
aa80: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
aa90: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
aaa0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
aab0: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
aac0: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
aad0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
aae0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
aaf0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
ab00: 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
ab10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
ab20: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
ab30: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  ++){.      p->aO
ab40: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
ab50: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
ab60: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  cles = 0;.    }.
ab70: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
ab80: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
ab90: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
aba0: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
abb0: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
abc0: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
abd0: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
abe0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
abf0: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
ac00: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
ac10: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
ac20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
ac30: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
ac40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
ac50: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
ac60: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43  );.    /* The pC
ac70: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
ac80: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
ac90: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
aca0: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20  ists, by.    ** 
acb0: 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
acc0: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  */.  }else if( p
acd0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
ace0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
acf0: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
ad00: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  pCursor);.  }.#i
ad10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
ad30: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
ad40: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
ad50: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
ad60: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
ad70: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
ad80: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
ad90: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
ada0: 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75  ule = pCx->pModu
adb0: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
adc0: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
add0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
ade0: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
adf0: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
ae00: 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  od = 0;.  }.#end
ae10: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  if.}../*.** Copy
ae20: 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
ae30: 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  ed in the VdbeFr
ae40: 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ame structure to
ae50: 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a   its Vdbe. This.
ae60: 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20  ** is used, for 
ae70: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
ae80: 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67  trigger sub-prog
ae90: 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f  ram is halted to
aea0: 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74   restore.** cont
aeb0: 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  rol to the main 
aec0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20  program..*/.int 
aed0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
aee0: 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d  Restore(VdbeFram
aef0: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64  e *pFrame){.  Vd
af00: 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e  be *v = pFrame->
af10: 76 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  v;.  v->aOp = pF
af20: 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
af30: 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
af40: 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
af50: 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
af60: 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
af70: 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
af80: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
af90: 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
afa0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
afb0: 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
afc0: 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
afd0: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
afe0: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
aff0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74  ->nChange;.  ret
b000: 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
b010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
b020: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
b030: 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
b040: 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
b050: 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
b060: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
b070: 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
b080: 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
b090: 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
b0a0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
b0b0: 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
b0c0: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
b0d0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
b0e0: 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
b0f0: 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
b100: 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
b110: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
b120: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
b130: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
b140: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
b150: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
b160: 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e  me *pFrame = p->
b170: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
b180: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
b190: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
b1a0: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
b1b0: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
b1c0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
b1d0: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
b1e0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
b1f0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
b200: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
b210: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
b220: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
b230: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
b240: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
b250: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
b260: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
b270: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
b280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
b290: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
b2a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
b2b0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
b2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b2d0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
b2e0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
b2f0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
b300: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  nMem);.  }.}../*
b310: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
b320: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
b330: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
b340: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
b350: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
b360: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
b370: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
b380: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
b390: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
b3a0: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
b3b0: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
b3c0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
b3d0: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
b3e0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
b3f0: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
b400: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
b410: 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  >db;..#ifdef SQL
b420: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
b430: 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
b440: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
b450: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
b460: 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
b470: 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
b480: 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
b490: 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
b4a0: 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  d up.  */.  int 
b4b0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
b4c0: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
b4d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
b4e0: 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72  r==0 || p->apCsr
b4f0: 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  [i]==0 );.  for(
b500: 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  i=1; i<=p->nMem;
b510: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
b520: 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61  >aMem==0 || p->a
b530: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
b540: 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66  M_Null );.#endif
b550: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
b560: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
b570: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
b580: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
b590: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
b5a0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
b5b0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
b5c0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
b5d0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
b5e0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
b5f0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
b600: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
b610: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
b620: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
b630: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
b640: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
b650: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b660: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
b670: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
b680: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
b690: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
b6a0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
b6b0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
b6c0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
b6d0: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
b6e0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
b6f0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
b700: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
b710: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
b720: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
b730: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
b740: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
b750: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
b760: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
b770: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
b780: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
b790: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
b7a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
b7b0: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
b7c0: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
b7d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
b7e0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
b7f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
b800: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
b810: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
b820: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
b830: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
b840: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
b850: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
b860: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
b870: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
b880: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b890: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
b8a0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
b8b0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
b8c0: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
b8d0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
b8e0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
b8f0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
b900: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
b910: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
b920: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
b930: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
b940: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
b950: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
b960: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
b970: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
b980: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
b990: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
b9a0: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
b9b0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
b9c0: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
b9d0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
b9e0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
b9f0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
ba00: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
ba10: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
ba20: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ba30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
ba40: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
ba70: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
ba80: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
bab0: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
bac0: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
bad0: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
baf0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
bb00: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
bb10: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
bb20: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
bb30: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
bb40: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
bb50: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
bb60: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
bb70: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
bb80: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
bb90: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
bba0: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
bbb0: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
bbc0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
bbd0: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
bbe0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
bbf0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
bc00: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
bc10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
bc20: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
bc30: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
bc40: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
bc50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bc60: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
bc70: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
bc80: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
bc90: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
bca0: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
bcb0: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
bcc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
bcd0: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
bce0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
bcf0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
bd00: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
bd10: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
bd20: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
bd30: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
bd40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bd50: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
bd60: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
bd70: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
bd80: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
bd90: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
bda0: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
bdb0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
bdc0: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
bdd0: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
bde0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
bdf0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
be00: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
be10: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
be20: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
be30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
be40: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
be50: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
be60: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
be70: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
be80: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
be90: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
bea0: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
beb0: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
bec0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
bed0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
bee0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
bef0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
bf00: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
bf10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
bf20: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
bf30: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
bf40: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
bf50: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
bf60: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
bf70: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
bf80: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
bf90: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
bfa0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
bfb0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
bfc0: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
bfd0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
bfe0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
bff0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
c000: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
c010: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
c020: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
c030: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
c040: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
c050: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
c060: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c070: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
c080: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
c090: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
c0a0: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
c0b0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
c0c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
c0d0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
c0e0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
c0f0: 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  &p->zErrMsg);.  
c100: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c110: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
c120: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
c130: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
c140: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
c150: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
c160: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
c170: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
c180: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
c190: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
c1a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
c1b0: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
c1c0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
c1d0: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
c1e0: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
c1f0: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
c200: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
c210: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
c220: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
c230: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
c240: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
c250: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
c260: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
c270: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
c280: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
c290: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
c2a0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
c2b0: 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
c2c0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
c2d0: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
c2e0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
c2f0: 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
c300: 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20  ) nTrans++;.    
c310: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
c320: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
c330: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
c340: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
c350: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
c360: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
c370: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
c380: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
c390: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
c3a0: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
c3b0: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
c3c0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c3d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c3e0: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
c3f0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
c400: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
c410: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
c420: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
c430: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
c440: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
c450: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
c460: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
c470: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
c480: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
c490: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
c4a0: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
c4b0: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
c4c0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
c4d0: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
c4e0: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
c4f0: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
c500: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
c510: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
c520: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
c530: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
c540: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
c550: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
c560: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
c570: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
c580: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
c590: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
c5a0: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
c5b0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
c5c0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
c5d0: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
c5e0: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
c5f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
c600: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
c610: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
c620: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
c630: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
c640: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
c650: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c660: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
c670: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
c680: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c690: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
c6a0: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
c6b0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
c6c0: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
c6d0: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
c6e0: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
c6f0: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
c700: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
c710: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
c720: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
c730: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
c740: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
c750: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
c760: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
c770: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
c780: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
c790: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
c7a0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
c7b0: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
c7c0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
c7d0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
c7e0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
c7f0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
c800: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
c810: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
c820: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
c830: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c840: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
c850: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
c860: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
c870: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c880: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c890: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
c8a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
c8b0: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
c8c0: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
c8d0: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
c8e0: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
c8f0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
c900: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
c910: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
c920: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
c930: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
c940: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
c950: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
c960: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
c970: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
c980: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
c990: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
c9a0: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
c9b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
c9c0: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
c9d0: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
c9e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
c9f0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
ca00: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
ca10: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
ca20: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
ca30: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
ca40: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
ca50: 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
ca60: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
ca70: 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   res;..    /* Se
ca80: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
ca90: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
caa0: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
cab0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
cac0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
cad0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
cae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
caf0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
cb00: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
cb10: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73  dom);.      zMas
cb20: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
cb30: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25  intf(db, "%s-mj%
cb40: 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c  08X", zMainFile,
cb50: 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66   iRandom&0x7ffff
cb60: 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fff);.      if( 
cb70: 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !zMaster ){.    
cb80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cb90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
cba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
cbb0: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
cbc0: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
cbd0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
cbe0: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
cbf0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
cc00: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
cc10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cc20: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
cc30: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
cc40: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
cc50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
cc60: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
cc70: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
cc80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
cc90: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
cca0: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
ccb0: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
ccc0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
ccd0: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
cce0: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
ccf0: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
cd00: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
cd10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cd20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
cd30: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
cd40: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cd50: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
cd60: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
cd70: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
cd80: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
cd90: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
cda0: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
cdb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
cdc0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
cdd0: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
cde0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
cdf0: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
ce00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ce10: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
ce20: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
ce30: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
ce40: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
ce50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ce60: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
ce70: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
ce80: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
ce90: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
cea0: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
ceb0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
cec0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ced0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
cee0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
cef0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
cf00: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
cf10: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
cf20: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
cf30: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
cf40: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
cf50: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
cf60: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 7c 7c   if( zFile==0 ||
cf70: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 7b 0a   zFile[0]==0 ){.
cf80: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
cf90: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
cfa0: 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
cfb0: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
cfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cfd0: 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
cfe0: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
cff0: 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
d000: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
d010: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
d020: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
d030: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d040: 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
d050: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
d060: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
d070: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
d080: 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
d090: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
d0a0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
d0b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
d0d0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
d0e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
d0f0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
d100: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
d110: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
d130: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
d140: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d150: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d160: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
d170: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d180: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
d190: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
d1a0: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
d1b0: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
d1c0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
d1d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d1e0: 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
d1f0: 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
d200: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
d210: 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
d220: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
d230: 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
d240: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d250: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
d260: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
d270: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
d280: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d290: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
d2a0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
d2b0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
d2c0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
d2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
d2e0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
d2f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
d300: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
d310: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
d320: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
d330: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
d340: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
d350: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
d360: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d370: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
d380: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
d390: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
d3a0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
d3b0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
d3c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d3d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
d3e0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
d3f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
d400: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
d410: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
d420: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d430: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
d440: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
d450: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
d460: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
d470: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
d480: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
d490: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
d4a0: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
d4b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d4c0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
d4d0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
d4e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
d4f0: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
d500: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
d510: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
d520: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d530: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d540: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
d550: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
d560: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
d570: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
d580: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d590: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
d5a0: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
d5b0: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
d5c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
d5d0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
d5e0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
d5f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d600: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d610: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
d620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
d630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
d640: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
d650: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
d660: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
d670: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
d680: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
d690: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
d6a0: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
d6b0: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
d6c0: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
d6d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
d6e0: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
d6f0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
d700: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
d710: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
d720: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
d730: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
d740: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
d750: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
d760: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
d770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d780: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
d790: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
d7a0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
d7b0: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
d7c0: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
d7d0: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
d7e0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
d7f0: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
d800: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
d810: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
d820: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
d830: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
d840: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
d850: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
d860: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
d870: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
d880: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
d890: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
d8a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
d8b0: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
d8c0: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
d8d0: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
d8e0: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
d8f0: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
d900: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
d910: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
d920: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
d930: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
d940: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
d950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
d960: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
d970: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d980: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
d990: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
d9a0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
d9b0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
d9c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
d9d0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
d9e0: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
d9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
da00: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
da10: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
da20: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
da30: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
da40: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
da50: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
da60: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
da70: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
da80: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
da90: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
daa0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
dab0: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
dac0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
dad0: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
dae0: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
daf0: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
db00: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
db10: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
db20: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
db30: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
db40: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
db50: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
db60: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
db70: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
db80: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
db90: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
dba0: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
dbb0: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
dbc0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
dbd0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
dbe0: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
dbf0: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
dc00: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
dc10: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
dc20: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
dc30: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
dc40: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
dc50: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
dc60: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
dc70: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
dc80: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
dc90: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
dca0: 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
dcb0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
dcc0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
dcd0: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
dce0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
dcf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
dd00: 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56  rite==db->writeV
dd10: 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73  dbeCnt );.}.#els
dd20: 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
dd30: 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
dd40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
dd50: 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68  r every Btree th
dd60: 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  at in database c
dd70: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69  onnection db whi
dd80: 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ch .** has been 
dd90: 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22  modified, "trip"
dda0: 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65   or invalidate e
ddb0: 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a  ach cursor in.**
ddc0: 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68   that Btree migh
ddd0: 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  t have been modi
dde0: 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  fied so that the
ddf0: 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e   cursor.** can n
de00: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61  ever be used aga
de10: 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  in.  This happen
de20: 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  s when a rollbac
de30: 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57  k.*** occurs.  W
de40: 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61  e have to trip a
de50: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72  ll the other cur
de60: 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75  sors, even.** cu
de70: 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20  rsor from other 
de80: 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  VMs in different
de90: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
dea0: 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61  tions,.** so tha
deb0: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74  t none of them t
dec0: 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61  ry to use the da
ded0: 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79  ta at which they
dee0: 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e  .** were pointin
def0: 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20  g and which now 
df00: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68  may have been ch
df10: 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20  anged due.** to 
df20: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
df30: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  .** Remember tha
df40: 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e  t a rollback can
df50: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63   delete tables c
df60: 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72  omplete and.** r
df70: 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73  eorder rootpages
df80: 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20  .  So it is not 
df90: 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20  sufficient just 
dfa0: 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73  to save.** the s
dfb0: 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
dfc0: 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  or.  We have to 
dfd0: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
dfe0: 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74  ursor.** so that
dff0: 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65   it is never use
e000: 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  d again..*/.stat
e010: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
e020: 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66  teCursorsOnModif
e030: 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65  iedBtrees(sqlite
e040: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
e050: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
e060: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
e070: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
e080: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
e090: 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33  if( p && sqlite3
e0a0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
e0b0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
e0c0: 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
e0d0: 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f  rsors(p, SQLITE_
e0e0: 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20  ABORT);.    }.  
e0f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
e100: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
e110: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
e120: 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
e130: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
e140: 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
e150: 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
e160: 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
e170: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
e180: 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
e190: 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
e1a0: 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
e1b0: 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
e1c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
e1d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
e1e0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
e1f0: 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
e200: 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
e210: 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
e220: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
e230: 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ommtted..**.** I
e240: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
e250: 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
e260: 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
e270: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
e280: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
e290: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
e2a0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
e2b0: 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
e2c0: 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
e2d0: 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
e2e0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
e2f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e300: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53  ;..  /* If p->iS
e310: 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61  tatement is grea
e320: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
e330: 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70  hen this Vdbe op
e340: 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61  ened a .  ** sta
e350: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
e360: 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  on that should b
e370: 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54  e closed here. T
e380: 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f  he only exceptio
e390: 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61  n.  ** is that a
e3a0: 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68  n IO error may h
e3b0: 61 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75  ave occured, cau
e3c0: 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
e3d0: 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
e3e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
e3f0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
e400: 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
e410: 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
e420: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
e430: 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
e440: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
e450: 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
e460: 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
e470: 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
e480: 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
e490: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
e4a0: 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
e4b0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
e4c0: 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
e4d0: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
e4e0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
e4f0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
e500: 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
e510: 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
e520: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
e530: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e540: 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
e550: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e560: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
e570: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e580: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
e590: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
e5a0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
e5b0: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
e5c0: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
e5d0: 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
e5e0: 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
e5f0: 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
e600: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
e610: 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
e620: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e630: 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
e640: 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
e650: 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
e660: 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
e670: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
e680: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
e690: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e6a0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
e6b0: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
e6c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
e6d0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
e6e0: 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
e6f0: 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nt = 0;..    /* 
e700: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
e710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
e720: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
e730: 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
e740: 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
e750: 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
e760: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
e770: 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
e780: 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
e790: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  n .    ** the st
e7a0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
e7b0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
e7c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   */.    if( eOp=
e7d0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
e7e0: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ACK ){.      db-
e7f0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
e800: 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
e810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
e820: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e830: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
e840: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
e850: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
e860: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
e870: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
e880: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
e890: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
e8a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
e8b0: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
e8c0: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
e8d0: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
e8e0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
e8f0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
e900: 20 64 6f 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20   doing so it.** 
e910: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
e920: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
e930: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
e940: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
e950: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
e960: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
e970: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
e980: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
e990: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
e9a0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
e9b0: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
e9c0: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
e9d0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
e9e0: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
e9f0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20  BtreeEnterAll() 
ea00: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
ea10: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
ea20: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
ea30: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
ea40: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
ea50: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
ea60: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
ea70: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
ea80: 69 74 68 20 74 68 65 20 56 4d 2e 20 4f 66 20 63  ith the VM. Of c
ea90: 6f 75 72 73 65 20 6f 6e 6c 79 20 61 20 73 75 62  ourse only a sub
eaa0: 73 65 74 20 6f 66 20 74 68 65 73 65 20 73 74 72  set of these str
eab0: 75 63 74 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20  uctures.** will 
eac0: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
ead0: 68 65 20 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f  he VM, and we co
eae0: 75 6c 64 20 75 73 65 20 56 64 62 65 2e 62 74 72  uld use Vdbe.btr
eaf0: 65 65 4d 61 73 6b 20 74 6f 20 66 69 67 75 72 65  eeMask to figure
eb00: 0a 2a 2a 20 74 68 61 74 20 73 75 62 73 65 74 20  .** that subset 
eb10: 6f 75 74 2c 20 62 75 74 20 74 68 65 72 65 20 69  out, but there i
eb20: 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74  s no advantage t
eb30: 6f 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a  o doing so..**.*
eb40: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
eb50: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
eb60: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
eb70: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
eb80: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
eb90: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
eba0: 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  p..*/.#ifndef SQ
ebb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ebc0: 5f 43 41 43 48 45 0a 76 6f 69 64 20 73 71 6c 69  _CACHE.void sqli
ebd0: 74 65 33 56 64 62 65 4d 75 74 65 78 41 72 72 61  te3VdbeMutexArra
ebe0: 79 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  yEnter(Vdbe *p){
ebf0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
ec00: 41 44 53 41 46 45 0a 20 20 73 71 6c 69 74 65 33  ADSAFE.  sqlite3
ec10: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45  BtreeMutexArrayE
ec20: 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29  nter(&p->aMutex)
ec30: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
ec40: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 70  3BtreeEnterAll(p
ec50: 2d 3e 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ->db);.#endif.}.
ec60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
ec70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
ec80: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
ec90: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
eca0: 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
ecb0: 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
ecc0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
ecd0: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
ece0: 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
ecf0: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
ed00: 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
ed10: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
ed20: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
ed30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
ed40: 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
ed50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ed60: 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
ed70: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
ed80: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
ed90: 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
eda0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
edb0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
edc0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
edd0: 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
ede0: 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
edf0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
ee00: 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20  and write.** an 
ee10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
ee20: 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e   it. Then return
ee30: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
ee40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
ee50: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
ee60: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  Y.int sqlite3Vdb
ee70: 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70  eCheckFk(Vdbe *p
ee80: 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b  , int deferred){
ee90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
eea0: 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64   p->db;.  if( (d
eeb0: 65 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e  eferred && db->n
eec0: 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20  DeferredCons>0) 
eed0: 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
eee0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
eef0: 74 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72  t>0) ){.    p->r
ef00: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
ef10: 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72  RAINT;.    p->er
ef20: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
ef30: 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
ef40: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
ef50: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72  ErrMsg, db, "for
ef60: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
ef70: 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
ef80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ef90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
efa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
efb0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
efc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
efd0: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
efe0: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
eff0: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
f000: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
f010: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
f020: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
f030: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
f040: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
f050: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
f060: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
f070: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
f080: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f090: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
f0a0: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
f0b0: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
f0c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
f0d0: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
f0e0: 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
f0f0: 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
f100: 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
f110: 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
f120: 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
f130: 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
f140: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
f150: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
f160: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
f170: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
f180: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
f190: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
f1a0: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
f1b0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
f1c0: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
f1d0: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
f1e0: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
f1f0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
f200: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
f210: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
f220: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
f230: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
f250: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
f260: 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
f270: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
f280: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
f290: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
f2a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
f2b0: 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
f2c0: 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
f2d0: 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
f2e0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
f2f0: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
f300: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
f310: 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
f320: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
f330: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
f340: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
f350: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
f360: 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
f370: 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
f380: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
f390: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
f3a0: 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
f3b0: 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
f3c0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
f3d0: 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
f3e0: 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
f3f0: 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
f400: 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
f410: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
f420: 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
f430: 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
f440: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
f450: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
f460: 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
f470: 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
f480: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
f490: 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
f4a0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
f4b0: 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
f4c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
f4d0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
f4e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f4f0: 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
f500: 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
f510: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
f520: 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
f530: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f540: 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
f550: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
f560: 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
f570: 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
f580: 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
f590: 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a   never started *
f5a0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
f5b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
f5c0: 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
f5d0: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
f5e0: 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
f5f0: 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
f600: 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
f610: 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
f620: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
f630: 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
f640: 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
f650: 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
f660: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
f670: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
f680: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78  sqlite3VdbeMutex
f690: 41 72 72 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a  ArrayEnter(p);..
f6a0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
f6b0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
f6c0: 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
f6d0: 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
f6e0: 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74  0xff;.    assert
f6f0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
f700: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
f710: 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
f720: 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73  no longer exists
f730: 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61   */.    isSpecia
f740: 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
f750: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
f760: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
f790: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
f7a0: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
f7b0: 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
f7c0: 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
f7d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
f7e0: 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
f7f0: 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20  , we need do no 
f800: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e  rollback at all.
f810: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
f820: 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74    ** proceed wit
f830: 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68 61  h the special ha
f840: 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  ndling..      */
f850: 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
f860: 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
f870: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
f880: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f890: 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
f8a0: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
f8b0: 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
f8c0: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
f8d0: 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
f8e0: 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
f8f0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
f900: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f910: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
f920: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
f930: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
f940: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
f950: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
f960: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
f970: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
f980: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
f990: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
f9a0: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
f9b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
f9c0: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
f9d0: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
f9e0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
f9f0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
fa00: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
fa10: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
fa20: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
fa30: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
fa40: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
fa50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
fa60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
fa70: 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
fa80: 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
fa90: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
faa0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
fab0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
fac0: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
fad0: 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
fae0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
faf0: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
fb00: 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
fb10: 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
fb20: 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
fb30: 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
fb40: 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
fb50: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
fb60: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
fb70: 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
fb80: 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
fb90: 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
fba0: 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
fbb0: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
fbc0: 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
fbd0: 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
fbe0: 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
fbf0: 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
fc00: 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
fc10: 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
fc20: 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77  t .     && db->w
fc30: 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d  riteVdbeCnt==(p-
fc40: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
fc50: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
fc60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
fc70: 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
fc80: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
fc90: 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
fca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
fcb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
fcc0: 46 6b 28 70 2c 20 31 29 20 29 7b 0a 20 20 20 20  Fk(p, 1) ){.    
fcd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
fce0: 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76  eeMutexArrayLeav
fcf0: 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20  e(&p->aMutex);. 
fd00: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
fd10: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
fd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fd30: 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
fd40: 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
fd50: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
fd60: 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
fd70: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20   .        ** or 
fd80: 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
fd90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
fda0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
fdb0: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
fdc0: 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
fdd0: 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
fde0: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
fdf0: 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
fe00: 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
fe10: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
fe20: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
fe30: 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
fe40: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , p);.        if
fe50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
fe60: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  Y ){.          s
fe70: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
fe80: 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
fe90: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
fea0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
feb0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
fec0: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
fed0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
fee0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
fef0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ff00: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
ff10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ff20: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
ff30: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
ff40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ff50: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
ff60: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
ff70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
ff80: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ff90: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
ffa0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
ffb0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
ffc0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
ffd0: 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
ffe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
fff0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
10000 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
10010 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
10020 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
10030 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
10040 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
10050 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
10060 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
10070 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
10080 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
10090 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
100a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
100b0 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
100c0 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
100d0 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
100e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
100f0 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
10100 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
10110 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
10120 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
10130 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
10140 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
10150 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
10160 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
10170 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
10180 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
10190 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
101a0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
101b0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
101c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
101d0 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
101e0 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
101f0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
10200 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
10210 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
10220 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
10230 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
10240 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
10250 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
10260 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
10270 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
10280 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
10290 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   code..    **.  
102a0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 73    ** Note that s
102b0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
102c0 74 61 74 65 6d 65 6e 74 28 29 20 63 61 6e 20 6f  tatement() can o
102d0 6e 6c 79 20 66 61 69 6c 20 69 66 20 65 53 74 61  nly fail if eSta
102e0 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20  tementOp.    ** 
102f0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
10300 4c 42 41 43 4b 2e 20 20 42 75 74 20 69 66 20 70  LBACK.  But if p
10310 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10320 74 68 65 6e 20 65 53 74 61 74 65 6d 65 6e 74 4f  then eStatementO
10330 70 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 65  p.    ** must be
10340 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10350 53 45 2e 20 20 48 65 6e 63 65 20 74 68 65 20 4e  SE.  Hence the N
10360 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  EVER(p->rc==SQLI
10370 54 45 5f 4f 4b 29 20 69 6e 20 0a 20 20 20 20 2a  TE_OK) in .    *
10380 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
10390 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
103a0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
103b0 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
103c0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
103d0 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
103e0 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
103f0 20 20 69 66 28 20 72 63 20 26 26 20 28 4e 45 56    if( rc && (NEV
10400 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ER(p->rc==SQLITE
10410 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  _OK) || p->rc==S
10420 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10430 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
10440 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
10450 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10460 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
10470 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
10480 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sg = 0;.      }.
10490 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
104a0 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
104b0 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
104c0 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
104d0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
104e0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
104f0 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
10500 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
10510 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10520 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
10530 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
10540 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
10550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
10560 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
10570 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
10580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10590 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
105a0 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
105b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
105c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
105d0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
105e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
105f0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
10600 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
10610 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
10620 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
10630 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
10640 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
10650 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
10660 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
10670 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
10680 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
10690 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
106a0 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
106b0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
106c0 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
106d0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
106e0 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
106f0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
10700 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
10710 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
10720 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
10730 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tex);.  }..  /* 
10740 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
10750 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
10760 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
10770 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
10780 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
10790 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
107a0 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
107b0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
107c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62  Only ){.      db
107d0 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d  ->writeVdbeCnt--
107e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
107f0 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
10800 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65  beCnt>=db->write
10810 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20  VdbeCnt );.  }. 
10820 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
10830 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
10840 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
10850 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
10860 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10870 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
10880 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10890 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
108a0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
108b0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
108c0 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74  then any locks t
108d0 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20  hat were held.  
108e0 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** by connection
108f0 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65   db have now bee
10900 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c  n released. Call
10910 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
10920 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20  onUnlocked() .  
10930 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79  ** to invoke any
10940 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b   required unlock
10950 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
10960 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
10970 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
10980 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
10990 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62  ctionUnlocked(db
109a0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
109b0 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
109c0 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  Cnt>0 || db->aut
109d0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
109e0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
109f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10a00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
10a10 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
10a20 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
10a30 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
10a40 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
10a50 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
10a60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
10a70 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
10a80 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
10a90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10aa0 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
10ab0 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
10ac0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
10ad0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
10ae0 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
10af0 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
10b00 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
10b10 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
10b20 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
10b30 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
10b40 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
10b50 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
10b60 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
10b70 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
10b80 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
10b90 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
10ba0 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
10bb0 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
10bc0 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
10bd0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
10be0 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
10bf0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
10c00 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
10c10 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
10c20 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
10c30 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
10c40 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
10c50 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
10c60 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
10c70 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
10c80 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
10c90 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
10ca0 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
10cb0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
10cc0 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
10cd0 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
10ce0 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
10cf0 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
10d00 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
10d10 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
10d20 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
10d30 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
10d40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
10d50 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76  BE has be run ev
10d60 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
10d70 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
10d80 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
10d90 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
10da0 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
10db0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
10dc0 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
10dd0 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
10de0 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
10df0 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
10e00 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
10e10 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
10e20 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
10e30 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
10e40 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
10e50 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
10e60 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
10e70 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
10e80 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
10e90 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
10ea0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
10eb0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10ec0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
10ed0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
10ee0 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51  -1,p->zErrMsg,SQ
10ef0 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45  LITE_UTF8,SQLITE
10f00 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
10f10 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
10f20 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
10f30 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
10f40 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71   p->rc;.      sq
10f50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10f60 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
10f70 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
10f80 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
10f90 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
10fa0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
10fb0 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
10fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
10fd0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
10fe0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20  LITE_OK, 0);.   
10ff0 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75   }.    if( p->ru
11000 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
11010 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
11020 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
11030 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
11040 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
11050 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
11060 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
11070 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
11080 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
11090 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
110a0 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
110b0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
110c0 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
110d0 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
110e0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
110f0 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
11100 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
11110 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
11120 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >rc, 0);.    sql
11130 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
11140 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
11150 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
11160 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52  _UTF8, SQLITE_TR
11170 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
11180 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11190 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
111a0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
111b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
111c0 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
111d0 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
111e0 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
111f0 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
11200 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
11210 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
11220 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
11230 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
11240 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
11250 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
11260 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
11270 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
11280 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
11290 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
112a0 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
112b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
112c0 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
112d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
112e0 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
112f0 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
11300 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
11310 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
11320 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11330 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
11340 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
11350 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38  , "%6d %10lld %8
11360 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  lld ",.         
11370 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
11380 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
11390 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
113a0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
113b0 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
113c0 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
113d0 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
113e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
113f0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
11400 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
11410 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
11420 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
11430 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
11440 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ndif.  p->magic 
11450 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
11460 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  T;.  return p->r
11470 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
11480 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
11490 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
114a0 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
114b0 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
114c0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
114d0 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
114e0 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
114f0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
11500 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
11510 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
11520 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
11530 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
11540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11550 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
11560 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
11570 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
11580 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
11590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
115a0 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
115b0 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
115c0 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
115d0 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rc );.  }.  sqli
115e0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
115f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11600 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ../*.** Call the
11610 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
11620 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74  each auxdata ent
11630 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20  ry in pVdbeFunc 
11640 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65  for which.** the
11650 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
11660 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c  it in mask is cl
11670 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e  ear.  Auxdata en
11680 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a  tries beyond 31.
11690 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65  ** are always de
116a0 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73  stroyed.  To des
116b0 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61  troy all auxdata
116c0 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74   entries, call t
116d0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  his.** routine w
116e0 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a  ith mask==0..*/.
116f0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
11700 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64  DeleteAuxData(Vd
11710 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
11720 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  c, int mask){.  
11730 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
11740 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e  ; i<pVdbeFunc->n
11750 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Aux; i++){.    s
11760 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70  truct AuxData *p
11770 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63  Aux = &pVdbeFunc
11780 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20  ->apAux[i];.    
11790 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d  if( (i>31 || !(m
117a0 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69  ask&(((u32)1)<<i
117b0 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75  ))) && pAux->pAu
117c0 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  x ){.      if( p
117d0 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
117e0 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
117f0 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
11800 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11810 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b   pAux->pAux = 0;
11820 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11830 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
11840 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
11850 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
11860 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
11870 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
11880 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
11890 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
118a0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
118b0 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
118c0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
118d0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
118e0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
118f0 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
11900 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
11910 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
11920 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
11930 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
11940 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
11950 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
11960 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
11970 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61  ->nVar);.  relea
11980 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
11990 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
119a0 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
119b0 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  ;.  vdbeFreeOpAr
119c0 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
119d0 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
119e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
119f0 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aLabel);.  sqlit
11a00 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
11a10 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
11a20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11a30 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61  ->zSql);.  p->ma
11a40 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
11a50 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33  _DEAD;.  sqlite3
11a60 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
11a70 72 65 65 29 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  ree);.  p->db = 
11a80 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
11a90 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
11aa0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
11ab0 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
11ac0 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
11ad0 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
11ae0 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
11af0 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
11b00 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
11b10 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
11b20 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
11b30 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
11b40 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
11b50 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
11b60 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
11b70 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
11b80 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
11b90 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
11ba0 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
11bb0 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
11bc0 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
11bd0 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
11be0 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
11bf0 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
11c00 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
11c10 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
11c20 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
11c30 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
11c40 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
11c50 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
11c60 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
11c70 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
11c80 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
11c90 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
11ca0 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
11cb0 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
11cc0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
11cd0 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
11ce0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
11cf0 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
11d00 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
11d10 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
11d20 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
11d30 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
11d40 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
11d50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
11d60 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
11d70 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
11d80 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
11d90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
11da0 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
11db0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
11dc0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
11dd0 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
11de0 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
11df0 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
11e00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11e10 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
11e20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
11e30 74 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  t;.    p->rowidI
11e40 73 56 61 6c 69 64 20 3d 20 41 4c 57 41 59 53 28  sValid = ALWAYS(
11e50 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b 0a 20 20  res==0) ?1:0;.  
11e60 20 20 69 66 28 20 4e 45 56 45 52 28 72 65 73 3c    if( NEVER(res<
11e70 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  0) ){.      rc =
11e80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
11e90 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  t(p->pCursor, &r
11ea0 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
11eb0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11ec0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
11ed0 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
11ee0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
11ef0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
11f00 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
11f10 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
11f20 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
11f30 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  _STALE;.  }else 
11f40 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43  if( ALWAYS(p->pC
11f50 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e  ursor) ){.    in
11f60 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20  t hasMoved;.    
11f70 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
11f80 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
11f90 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ved(p->pCursor, 
11fa0 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20  &hasMoved);.    
11fb0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
11fc0 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d  rc;.    if( hasM
11fd0 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  oved ){.      p-
11fe0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
11ff0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
12000 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31    p->nullRow = 1
12010 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12030 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
12040 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
12050 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
12060 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
12070 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
12080 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
12090 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
120a0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
120b0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
120c0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
120d0 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
120e0 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
120f0 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
12100 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
12110 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
12120 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
12130 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
12140 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
12150 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
12160 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
12170 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
12180 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
12190 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
121a0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
121b0 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
121c0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
121d0 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
121e0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
121f0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
12200 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
12210 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
12220 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
12230 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
12240 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
12250 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
12260 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
12270 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
12280 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
12290 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
122a0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
122b0 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
122c0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
122d0 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
122e0 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
122f0 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
12300 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
12310 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
12320 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
12330 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
12340 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
12350 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
12360 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
12370 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
12380 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
12390 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
123a0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
123b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
123d0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
123e0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
123f0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
12400 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
12410 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
12420 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
12430 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
12440 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
12450 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
12460 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
12470 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
124a0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
124b0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
124c0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
124d0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
124e0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
12510 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
12520 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
12540 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
12550 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
12560 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
12570 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
12580 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
12590 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
125b0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
125c0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
125d0 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
125e0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
125f0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
12600 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
12610 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
12640 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
12650 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
12660 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
12670 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
12680 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
12690 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
126a0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
126b0 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
126c0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
126d0 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
126e0 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
126f0 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
12700 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
12710 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
12720 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
12730 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
12740 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
12750 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
12760 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
12770 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
12780 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
12790 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
127a0 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
127b0 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
127c0 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
127d0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
127e0 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
127f0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
12800 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
12810 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
12820 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
12830 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
12840 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
12850 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
12860 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
12870 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
12880 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
12890 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
128a0 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
128b0 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
128c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
128d0 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20  +(u32)i;.    }. 
128e0 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20     u = i<0 ? -i 
128f0 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  : i;.    if( u<=
12900 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  127 ) return 1;.
12910 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
12920 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
12930 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
12940 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
12950 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
12960 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
12970 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
12980 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
12990 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
129a0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
129b0 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
129c0 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
129d0 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
129e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
129f0 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
12a00 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
12a10 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
12a20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
12a30 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
12a40 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
12a50 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
12a60 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
12a70 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
12a80 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
12a90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
12aa0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
12ab0 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
12ac0 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
12ad0 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
12ae0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
12af0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
12b00 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
12b10 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
12b20 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
12b30 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
12b40 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
12b50 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
12b60 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
12b70 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
12b80 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
12b90 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
12ba0 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
12bb0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
12bc0 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
12bd0 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
12be0 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
12bf0 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
12c00 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
12c10 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
12c20 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
12c30 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
12c40 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
12c50 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
12c60 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
12c70 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
12c80 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
12c90 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
12ca0 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
12cb0 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
12cc0 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
12cd0 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
12ce0 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
12cf0 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
12d00 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
12d10 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
12d20 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
12d30 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
12d40 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
12d50 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
12d60 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
12d70 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
12d80 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
12d90 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
12da0 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
12db0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
12dc0 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
12dd0 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
12de0 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
12df0 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
12e00 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
12e10 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
12e20 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
12e30 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
12e40 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
12e50 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
12e60 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
12e70 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
12e80 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
12e90 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
12ea0 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
12eb0 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
12ec0 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
12ed0 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
12ee0 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
12ef0 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
12f00 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
12f10 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
12f20 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
12f30 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
12f40 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
12f50 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
12f60 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
12f70 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
12f80 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
12f90 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
12fa0 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
12fb0 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
12fc0 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
12fd0 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
12fe0 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
12ff0 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
13000 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
13010 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
13020 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
13030 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
13040 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
13050 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
13060 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
13070 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
13080 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
13090 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
130a0 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
130b0 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
130c0 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
130d0 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
130e0 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
130f0 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
13100 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
13110 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
13120 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
13130 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
13140 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
13150 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
13160 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
13170 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
13180 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
13190 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
131a0 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
131b0 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
131c0 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
131d0 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
131e0 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
131f0 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
13200 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
13210 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
13220 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
13230 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
13240 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
13250 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
13260 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
13270 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
13280 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
13290 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
132a0 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
132b0 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
132c0 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
132d0 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
132e0 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
132f0 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
13300 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
13310 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
13320 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
13330 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
13340 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
13350 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
13360 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
13370 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
13380 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
13390 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
133a0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
133b0 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
133c0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
133d0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
133e0 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
133f0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
13400 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
13410 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
13420 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
13430 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
13440 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
13450 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
13460 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
13470 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
13480 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
13490 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
134a0 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
134b0 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
134c0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
134d0 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
134e0 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
134f0 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
13500 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
13510 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
13520 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
13530 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
13540 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
13550 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
13560 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
13570 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
13580 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
13590 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
135a0 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
135b0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
135c0 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
135d0 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
135e0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
135f0 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
13600 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
13610 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
13620 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
13630 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
13640 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
13650 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
13660 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
13670 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
13680 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
13690 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
136a0 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
136b0 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
136c0 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
136d0 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
136e0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
136f0 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
13700 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
13710 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
13720 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
13730 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
13740 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
13750 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
13760 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
13770 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
13780 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
13790 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
137a0 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
137b0 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
137c0 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
137d0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
137e0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
137f0 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
13800 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  ->r) );.      me
13810 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
13820 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
13830 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
13840 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
13850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
13860 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
13870 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
13880 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
13890 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
138a0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
138b0 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e  ert( len<=(u32)n
138c0 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
138d0 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
138e0 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30  uf[i] = (u8)(v&0
138f0 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
13900 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
13910 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
13920 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
13930 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
13940 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
13950 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
13960 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
13970 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
13980 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
13990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
139a0 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
139b0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
139c0 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
139d0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
139e0 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
139f0 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
13a00 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
13a10 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
13a20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
13a30 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
13a40 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
13a50 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  m->u.nZero;.    
13a60 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d    assert( nBuf>=
13a70 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  0 );.      if( l
13a80 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29  en > (u32)nBuf )
13a90 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
13aa0 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20  (u32)nBuf;.     
13ab0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
13ac0 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
13ad0 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
13ae0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13af0 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
13b00 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
13b10 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
13b20 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
13b30 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
13b40 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
13b50 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
13b60 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
13b70 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
13b80 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
13b90 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
13ba0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
13bb0 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75  ytes read..*/ .u
13bc0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
13bd0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
13be0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13bf0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
13c00 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
13c10 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
13c20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
13c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
13c40 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
13c50 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
13c60 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
13c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
13c80 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
13c90 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
13ca0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
13cb0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
13cc0 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
13cd0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
13ce0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
13cf0 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
13d00 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
13d10 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
13d20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
13d30 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
13d40 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
13d50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13d60 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
13d70 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
13d80 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
13d90 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
13da0 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
13db0 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
13dc0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
13dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
13de0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
13df0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
13e00 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
13e10 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
13e20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
13e30 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
13e40 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
13e50 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
13e60 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
13e70 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
13e80 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
13e90 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
13ea0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
13eb0 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
13ec0 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
13ed0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
13ee0 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
13ef0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
13f00 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
13f10 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
13f20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
13f30 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
13f40 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
13f50 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
13f60 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
13f70 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
13f80 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
13f90 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
13fa0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
13fb0 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
13fc0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
13fd0 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
13fe0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
13ff0 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
14000 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
14010 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
14020 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
14030 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
14040 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
14050 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
14060 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
14070 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
14080 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
14090 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
140a0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
140b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
140c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
140d0 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
140e0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
140f0 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
14100 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
14110 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
14120 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
14130 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
14140 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
14150 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
14160 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
14170 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
14180 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
14190 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
141a0 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
141b0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
141c0 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
141d0 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
141e0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
141f0 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
14200 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
14210 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
14220 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
14230 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
14240 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
14250 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
14260 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
14270 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
14280 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
14290 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
142a0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
142b0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
142c0 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
142d0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
142e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
142f0 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
14300 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
14310 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
14320 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
14330 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
14340 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
14350 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
14360 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
14370 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
14380 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
14390 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
143a0 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
143b0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
143c0 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
143d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
143e0 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
143f0 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
14400 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
14410 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
14420 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
14440 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
14450 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
14460 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
14470 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
14480 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
14490 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
144a0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
144b0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
144c0 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
144d0 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
144e0 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
144f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
14500 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
14510 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
14520 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
14530 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
14540 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
14550 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
14560 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
14570 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14580 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
14590 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
145a0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
145b0 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20        u32 len = 
145c0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
145d0 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
145e0 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
145f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
14600 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
14610 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
14620 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
14630 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
14640 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14650 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
14660 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
14670 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
14680 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
14690 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
146a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
146b0 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
146c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
146d0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
146e0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
146f0 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
14700 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73   in pKey[], pars
14710 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  e the.** record 
14720 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52  into a UnpackedR
14730 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e  ecord structure.
14740 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
14750 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74  er to.** that st
14760 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
14770 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
14780 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64  ion might provid
14790 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20  e szSpace bytes 
147a0 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  of memory.** spa
147b0 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54  ce at pSpace.  T
147c0 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65  his space can be
147d0 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
147e0 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44  e returned.** VD
147f0 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73  beParsedRecord s
14800 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69  tructure if it i
14810 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20  s large enough. 
14820 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74   If it is.** not
14830 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61   big enough, spa
14840 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ce is obtained f
14850 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
14860 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oc()..**.** The 
14870 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75  returned structu
14880 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  re should be clo
14890 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
148a0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44  .** sqlite3VdbeD
148b0 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
148c0 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63  ord()..*/ .Unpac
148d0 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
148e0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
148f0 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
14900 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
14910 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
14920 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
14930 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
14940 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
14950 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
14960 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
14970 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
14980 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
14990 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
149a0 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
149b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
149c0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
149d0 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74  ilable to hold t
149e0 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  he object */.  i
149f0 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20  nt szSpace      
14a00 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14a10 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
14a20 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
14a30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14a40 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
14a50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
14a60 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
14a70 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65  cord *p;  /* The
14a80 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
14a90 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65   that we will re
14aa0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  turn */.  int nB
14ab0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  yte;          /*
14ac0 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65   Memory space ne
14ad0 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20  eded to hold p, 
14ae0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
14af0 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  t d;.  u32 idx;.
14b00 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
14b10 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
14b20 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
14b30 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
14b40 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e   Mem *pMem;.  in
14b50 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t nOff;         
14b60 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53    /* Increase pS
14b70 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75 63  pace by this muc
14b80 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67  h to 8-byte alig
14b90 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a  n it */.  .  /*.
14ba0 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20    ** We want to 
14bb0 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65  shift the pointe
14bc0 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68  r pSpace up such
14bd0 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79   that it is 8-by
14be0 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a  te aligned..  **
14bf0 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74   Thus, we need t
14c00 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61  o calculate a va
14c10 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65  lue, nOff, betwe
14c20 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73  en 0 and 7, to s
14c30 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79  hift .  ** it by
14c40 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20  .  If pSpace is 
14c50 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61  already 8-byte a
14c60 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f  ligned, nOff sho
14c70 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a  uld be zero..  *
14c80 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20  /.  nOff = (8 - 
14c90 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
14ca0 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29  NT(pSpace) & 7))
14cb0 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b   & 7;.  pSpace +
14cc0 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63  = nOff;.  szSpac
14cd0 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79  e -= nOff;.  nBy
14ce0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
14cf0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
14d00 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
14d10 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
14d20 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
14d30 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20  yte>szSpace ){. 
14d40 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
14d50 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
14d60 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
14d70 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
14d80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e  eturn 0;.    p->
14d90 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
14da0 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50  _NEED_FREE | UNP
14db0 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
14dc0 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OY;.  }else{.   
14dd0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
14de0 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20  cord*)pSpace;.  
14df0 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50    p->flags = UNP
14e00 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
14e10 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65  OY;.  }.  p->pKe
14e20 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
14e30 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
14e40 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
14e50 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20   + 1;.  p->aMem 
14e60 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  = pMem = (Mem*)&
14e70 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
14e80 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
14e90 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
14ea0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
14eb0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
14ec0 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
14ed0 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
14ee0 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
14ef0 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
14f00 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
14f10 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26  & u<p->nField &&
14f20 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
14f30 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
14f40 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
14f50 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
14f60 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
14f70 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
14f80 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
14f90 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
14fa0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
14fb0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14fc0 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d   0;.    pMem->zM
14fd0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64  alloc = 0;.    d
14fe0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
14ff0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64  erialGet(&aKey[d
15000 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
15010 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b  pMem);.    pMem+
15020 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a  +;.    u++;.  }.
15030 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
15040 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
15050 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
15060 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28   = u;.  return (
15070 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  void*)p;.}../*.*
15080 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
15090 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b  estroys a Unpack
150a0 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e  edRecord object.
150b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
150c0 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
150d0 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65  edRecord(Unpacke
150e0 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69  dRecord *p){.  i
150f0 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  nt i;.  Mem *pMe
15100 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  m;..  assert( p!
15110 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15120 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  p->flags & UNPAC
15130 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
15140 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
15150 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70  Mem=p->aMem; i<p
15160 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70  ->nField; i++, p
15170 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54  Mem++){.    /* T
15180 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
15190 72 64 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e  rd is always con
151a0 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 0a  structed by the.
151b0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
151c0 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
151d0 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c   function above,
151e0 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c   which makes all
151f0 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  .    ** strings 
15200 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63  and blobs static
15210 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  .  And none of t
15220 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a  he elements are.
15230 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e      ** ever tran
15240 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72  sformed, so ther
15250 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68  e is never anyth
15260 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20  ing to delete.. 
15270 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
15280 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  VER(pMem->zMallo
15290 63 29 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  c) ) sqlite3Vdbe
152a0 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
152b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66  ;.  }.  if( p->f
152c0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
152d0 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20  NEED_FREE ){.   
152e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
152f0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
15300 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
15310 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
15320 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
15330 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
15340 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
15350 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
15360 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
15370 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
15380 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
15390 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
153a0 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
153b0 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
153c0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
153d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
153e0 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
153f0 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
15400 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
15410 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d  eated by th OP_M
15420 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
15430 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
15440 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
15450 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
15460 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
15470 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
15480 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
15490 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  ecord..**.** Key
154a0 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
154b0 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
154c0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
154d0 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20  r of fields..** 
154e0 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65 77  The key with few
154f0 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73 75  er fields is usu
15500 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65  ally compares le
15510 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20  ss than the .** 
15520 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77  longer key.  How
15530 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50 41  ever if the UNPA
15540 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61  CKED_INCRKEY fla
15550 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20  gs in pPKey2 is 
15560 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  set.** and the c
15570 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61  ommon prefixes a
15580 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b  re equal, then k
15590 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
155a0 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20   key2..** Or if 
155b0 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54  the UNPACKED_MAT
155c0 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69  CH_PREFIX flag i
155d0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70 72  s set and the pr
155e0 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71  efixes are.** eq
155f0 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65  ual, then the ke
15600 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ys are considere
15610 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e  d to be equal an
15620 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62  d.** the parts b
15630 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  eyond the common
15640 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f   prefix are igno
15650 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
15660 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  e UNPACKED_IGNOR
15670 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20  E_ROWID flag is 
15680 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  set, then the la
15690 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
156a0 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79  e header of pKey
156b0 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49  1 is ignored.  I
156c0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
156d0 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e  t pKey1 is.** an
156e0 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20   index key, and 
156f0 74 68 75 73 20 65 6e 64 73 20 77 69 74 68 20 61  thus ends with a
15700 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54   rowid value.  T
15710 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20  he last byte.** 
15720 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 77 69  of the header wi
15730 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
15740 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
15750 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a  of the rowid:.**
15760 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c   one of 1, 2, 3,
15770 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20   4, 5, 6, 8, or 
15780 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20  9 - the integer 
15790 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a  serial types..**
157a0 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
157b0 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   of the final ro
157c0 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  wid will always 
157d0 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  be a single byte
157e0 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67  ..** By ignoring
157f0 20 74 68 69 73 20 6c 61 73 74 20 62 79 74 65 20   this last byte 
15800 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c 20 77  of the header, w
15810 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70  e force the comp
15820 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e  arison.** to ign
15830 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20 61 74  ore the rowid at
15840 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31   the end of key1
15850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15860 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
15870 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
15880 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
15890 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
158a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
158b0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
158c0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
158d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20  /.){.  int d1;  
158e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
158f0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
15900 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
15910 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
15920 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
15930 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
15940 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
15950 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
15960 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
15970 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
15980 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
15990 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
159a0 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69   int nField;.  i
159b0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
159c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
159d0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
159e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
159f0 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
15a00 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
15a10 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
15a20 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
15a30 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e  KeyInfo;.  mem1.
15a40 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
15a50 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
15a60 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
15a70 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
15a80 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
15a90 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
15aa0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15ab0 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
15ac0 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  NLY( mem1.zMallo
15ad0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
15ae0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
15af0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
15b00 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
15b10 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
15b20 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
15b30 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
15b40 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
15b50 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
15b60 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
15b70 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
15b80 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
15b90 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
15ba0 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
15bb0 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
15bc0 6c 79 20 62 65 20 75 73 65 64 20 69 6e 69 74 69  ly be used initi
15bd0 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
15be0 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
15bf0 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
15c00 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
15c10 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
15c20 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
15c30 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
15c40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15c50 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
15c60 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
15c70 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
15c80 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
15c90 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
15ca0 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
15cb0 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
15cc0 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
15cd0 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
15ce0 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
15cf0 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
15d00 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
15d10 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
15d20 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
15d30 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
15d40 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b  zHdr1;.  if( pPK
15d50 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
15d60 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57  ACKED_IGNORE_ROW
15d70 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31  ID ){.    szHdr1
15d80 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64  --;.  }.  nField
15d90 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
15da0 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  eld;.  while( id
15db0 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70  x1<szHdr1 && i<p
15dc0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b  PKey2->nField ){
15dd0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
15de0 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
15df0 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
15e00 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
15e10 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
15e20 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
15e30 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
15e40 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
15e50 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20  erial_type1 );. 
15e60 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31     if( d1>=nKey1
15e70 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53   && sqlite3VdbeS
15e80 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
15e90 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62  ial_type1)>0 ) b
15ea0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78  reak;..    /* Ex
15eb0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
15ec0 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
15ed0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
15ee0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
15ef0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
15f00 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
15f10 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
15f20 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
15f30 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
15f40 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
15f50 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
15f60 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20  ey2->aMem[i],.  
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f80 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c           i<nFiel
15f90 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
15fa0 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
15fb0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
15fc0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
15fd0 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  .zMalloc==0 );  
15fe0 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
15ff0 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  elow */..      /
16000 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73  * Invert the res
16010 75 6c 74 20 69 66 20 77 65 20 61 72 65 20 75 73  ult if we are us
16020 69 6e 67 20 44 45 53 43 20 73 6f 72 74 20 6f 72  ing DESC sort or
16030 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  der. */.      if
16040 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
16050 74 4f 72 64 65 72 20 26 26 20 69 3c 6e 46 69 65  tOrder && i<nFie
16060 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld && pKeyInfo->
16070 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
16080 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
16090 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a  c;.      }.    .
160a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
160b0 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c  PREFIX_SEARCH fl
160c0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c  ag is set and al
160d0 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70 74 20  l fields except 
160e0 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20 20 20  the final.      
160f0 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77  ** rowid field w
16100 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  ere equal, then 
16110 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49 58  clear the PREFIX
16120 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64  _SEARCH flag and
16130 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 70   set .      ** p
16140 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20  PKey2->rowid to 
16150 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
16160 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20   rowid field in 
16170 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a  (pKey1, nKey1)..
16180 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
16190 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f   used by the OP_
161a0 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e  IsUnique opcode.
161b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
161c0 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61  if( (pPKey2->fla
161d0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
161e0 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26 20  EFIX_SEARCH) && 
161f0 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65  i==(pPKey2->nFie
16200 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ld-1) ){.       
16210 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73   assert( idx1==s
16220 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20  zHdr1 && rc );. 
16230 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
16240 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em1.flags & MEM_
16250 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  Int );.        p
16260 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20  PKey2->flags &= 
16270 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58  ~UNPACKED_PREFIX
16280 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20  _SEARCH;.       
16290 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d   pPKey2->rowid =
162a0 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20   mem1.u.i;.     
162b0 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 72 65   }.    .      re
162c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
162d0 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
162e0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
162f0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
16300 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
16310 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
16320 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
16330 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
16340 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
16350 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
16360 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
16370 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
16380 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
16390 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
163a0 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  m1)..  */.  asse
163b0 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
163c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
163d0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
163e0 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
163f0 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
16400 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
16410 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
16420 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
16430 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
16440 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
16450 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73  Y.  ** flag is s
16460 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74  et, then break t
16470 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74 69  he tie by treati
16480 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65  ng key2 as large
16490 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55  r..  ** If the U
164a0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
164b0 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c  TCH flag is set,
164c0 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20   then keys with 
164d0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a  common prefixes.
164e0 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65    ** are conside
164f0 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e  red to be equal.
16500 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
16510 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74   longer key is t
16520 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e  he .  ** larger.
16530 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c    As it happens,
16540 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c   the pPKey2 will
16550 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c   always be the l
16560 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68  onger.  ** if th
16570 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65  ere is a differe
16580 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nce..  */.  asse
16590 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69  rt( rc==0 );.  i
165a0 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
165b0 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52   & UNPACKED_INCR
165c0 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  KEY ){.    rc = 
165d0 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  -1;.  }else if( 
165e0 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
165f0 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
16600 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20  MATCH ){.    /* 
16610 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20  Leave rc==0 */. 
16620 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c   }else if( idx1<
16630 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63  szHdr1 ){.    rc
16640 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
16650 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a  rn rc;.}. ../*.*
16660 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
16670 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
16680 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
16690 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
166a0 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
166b0 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
166c0 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
166d0 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
166e0 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
166f0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
16700 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
16710 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
16720 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
16730 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
16740 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
16750 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
16760 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
16770 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
16780 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
16790 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
167a0 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
167b0 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
167c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
167d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
167e0 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
167f0 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
16800 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
16810 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
16820 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
16830 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
16840 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
16850 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
16860 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
16870 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
16880 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
16890 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
168a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
168b0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
168c0 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53  em m, v;..  UNUS
168d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
168e0 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
168f0 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
16900 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
16910 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
16920 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
16930 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
16940 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
16950 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
16960 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
16970 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
16980 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
16990 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
169a0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
169b0 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
169c0 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
169d0 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
169e0 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
169f0 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
16a00 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
16a10 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
16a20 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  Cur) );.  rc = s
16a30 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
16a40 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
16a50 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
16a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
16a70 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
16a80 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
16a90 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
16aa0 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
16ab0 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
16ac0 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
16ad0 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
16ae0 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
16af0 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
16b00 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
16b10 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  try */.  memset(
16b20 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
16b30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
16b40 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
16b50 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  e(pCur, 0, (int)
16b60 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
16b70 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
16b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16b90 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
16ba0 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
16bb0 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
16bc0 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
16bd0 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
16be0 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
16bf0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
16c00 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
16c10 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
16c20 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
16c30 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73  zHdr<3 || (int)s
16c40 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20  zHdr>m.n) ){.   
16c50 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
16c60 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
16c70 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66  .  /* The last f
16c80 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
16c90 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  x should be an i
16ca0 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57  nteger - the ROW
16cb0 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20  ID..  ** Verify 
16cc0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e  that the last en
16cd0 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  try really is an
16ce0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28   integer. */.  (
16cf0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
16d00 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
16d10 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b  -1], typeRowid);
16d20 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
16d30 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74  eRowid==1 );.  t
16d40 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
16d50 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  id==2 );.  testc
16d60 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
16d70 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
16d80 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b   typeRowid==4 );
16d90 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
16da0 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74  eRowid==5 );.  t
16db0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
16dc0 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63  id==6 );.  testc
16dd0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
16de0 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  8 );.  testcase(
16df0 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b   typeRowid==9 );
16e00 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
16e10 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74  typeRowid<1 || t
16e20 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79  ypeRowid>9 || ty
16e30 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20  peRowid==7) ){. 
16e40 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
16e50 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
16e60 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
16e70 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16e80 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
16e90 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
16ea0 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
16eb0 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
16ec0 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
16ed0 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
16ee0 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
16ef0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
16f00 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
16f10 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
16f20 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
16f30 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
16f40 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
16f50 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
16f60 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
16f70 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
16f80 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
16f90 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
16fa0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
16fb0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
16fc0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
16fd0 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
16fe0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
16ff0 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
17000 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
17010 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
17020 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
17030 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
17040 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
17050 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17060 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
17070 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  .zMalloc!=0 );. 
17080 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
17090 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
170a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
170b0 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
170c0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
170d0 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
170e0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
170f0 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
17100 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
17110 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
17120 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
17130 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
17140 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
17150 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
17160 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
17170 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
17180 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
17190 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
171a0 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
171b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
171c0 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
171d0 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
171e0 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
171f0 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
17200 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
17210 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
17220 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
17230 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
17240 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
17250 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
17260 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
17270 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
17280 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
17290 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
172a0 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
172b0 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
172c0 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
172d0 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
172e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
172f0 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
17300 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  e(.  VdbeCursor 
17310 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
17320 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
17330 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
17340 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
17350 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
17360 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76  ,  /* Unpacked v
17370 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f  ersion of key to
17380 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
17390 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
173c0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
173d0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
173e0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
173f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
17400 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
17410 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20  >pCursor;.  Mem 
17420 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  m;..  assert( sq
17430 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17440 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
17450 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
17460 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
17470 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
17480 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
17490 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70  TE_OK );    /* p
174a0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
174b0 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
174c0 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
174d0 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
174e0 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
174f0 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
17500 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
17510 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74  he say.  ** that
17520 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
17530 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
17540 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
17550 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
17560 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
17570 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
17580 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
17590 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
175a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
175b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
175c0 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73   memset(&m, 0, s
175d0 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20  izeof(m));.  rc 
175e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
175f0 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43  FromBtree(pC->pC
17600 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e  ursor, 0, (int)n
17610 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
17620 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
17630 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17640 20 20 61 73 73 65 72 74 28 20 70 55 6e 70 61 63    assert( pUnpac
17650 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ked->flags & UNP
17660 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57  ACKED_IGNORE_ROW
17670 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73  ID );.  *res = s
17680 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
17690 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a  Compare(m.n, m.z
176a0 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  , pUnpacked);.  
176b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
176c0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
176d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
176e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
176f0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
17700 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
17710 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
17720 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
17730 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
17740 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
17750 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
17760 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
17770 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
17780 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
17790 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
177a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
177b0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
177c0 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
177d0 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
177e0 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
177f0 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
17800 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
17810 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
17820 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
17830 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
17840 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
17850 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
17860 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
17870 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
17880 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
17890 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
178a0 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
178b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
178c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
178d0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
178e0 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
178f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
17900 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
17910 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
17920 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
17930 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
17940 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
17950 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
17960 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
17970 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
17980 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
17990 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
179a0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
179b0 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
179c0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
179d0 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
179e0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
179f0 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
17a00 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
17a10 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
17a20 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
17a30 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
17a40 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
17a50 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
17a60 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
17a70 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
17a80 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
17a90 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
17aa0 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
17ab0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
17ac0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
17ad0 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
17ae0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
17af0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
17b00 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
17b10 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
17b20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
17b30 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
17b40 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
17b50 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
17b60 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
17b70 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
17b80 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
17b90 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
17ba0 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
17bb0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
17bc0 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
17bd0 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
17be0 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
17bf0 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
17c00 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
17c10 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
17c20 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
17c30 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
17c40 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
17c50 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
17c60 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
17c70 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
17c80 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
17c90 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
17ca0 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
17cb0 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
17cc0 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
17cd0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
17ce0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
17cf0 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
17d00 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
17d10 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
17d20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
17d30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
17d40 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
17d50 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
17d60 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
17d70 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
17d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
17d90 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
17da0 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
17db0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
17dc0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
17dd0 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
17de0 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  F8);.        sql
17df0 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65  ite3VdbeMemStore
17e00 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74  Type((Mem *)pRet
17e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17e20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20   return pRet;.  
17e30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17e40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
17e50 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61  figure SQL varia
17e60 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74  ble iVar so that
17e70 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76   binding a new v
17e80 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61  alue to it signa
17e90 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ls.** to sqlite3
17ea0 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68  _reoptimize() th
17eb0 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20  at re-preparing 
17ec0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  the statement ma
17ed0 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
17ee0 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c   better query pl
17ef0 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  an..*/.void sqli
17f00 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
17f10 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  k(Vdbe *v, int i
17f20 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Var){.  assert( 
17f30 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
17f40 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76  iVar>32 ){.    v
17f50 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66  ->expmask = 0xff
17f60 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ffffff;.  }else{
17f70 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
17f80 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69  |= ((u32)1 << (i
17f90 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a     Var-1));.  }.}.