/ Hex Artifact Content
Login

Artifact 10d14b40a19e1aef3a271f78f7a55ecaca7e4c41:


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 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20  e - nField);.   
5190: 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20     aSortOrder = 
51a0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
51b0: 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rder;.      if( 
51c0: 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  aSortOrder ){.  
51d0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
51e0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e  aSortOrder = (un
51f0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b  signed char*)&pK
5200: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46  eyInfo->aColl[nF
5210: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ield];.        m
5220: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e  emcpy(pKeyInfo->
5230: 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72  aSortOrder, aSor
5240: 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b  tOrder, nField);
5250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5260: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5270: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
5280: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
5290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
52a0: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
52b0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
52c0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
52d0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
52e0: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
52f0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5300: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5310: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
5320: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
5330: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
5340: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5350: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5360: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5370: 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c  P4_VTAB;.    sql
5380: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
5390: 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20  able *)zP4);.   
53a0: 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c   assert( ((VTabl
53b0: 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d  e *)zP4)->db==p-
53c0: 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  >db );.  }else i
53d0: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
53e0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
53f0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5400: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
5410: 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b  char)n;.  }else{
5420: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
5430: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5440: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
5450: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
5460: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
5470: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
5480: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5490: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a  DYNAMIC;.  }.}..
54a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
54b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
54c0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74  comment on the t
54d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
54e0: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
54f0: 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72  on.  Or.** inser
5500: 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64  t a No-op and ad
5510: 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f  d the comment to
5520: 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75   that new instru
5530: 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20  ction.  This.** 
5540: 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65  makes the code e
5550: 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75  asier to read du
5560: 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20  ring debugging. 
5570: 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61   None of this ha
5580: 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72  ppens.** in a pr
5590: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a  oduction build..
55a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
55b0: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
55c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
55d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
55e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
55f0: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
5600: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5610: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
5620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5630: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
5640: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
5650: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
5660: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
5670: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
5680: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
5690: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
56a0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
56b0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
56c0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
56d0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
56e0: 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d   *pz);.    *pz =
56f0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5700: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
5710: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5720: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
5730: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
5740: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5760: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
5770: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
5780: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
5790: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
57a0: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
57b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
57c0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
57d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
57e0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
57f0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5800: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
5810: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
5820: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
5830: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
5840: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5850: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
5860: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5870: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
5880: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
5890: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
58a0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
58b0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
58c0: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
58d0: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
58e0: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
58f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5900: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
5910: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
5920: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
5930: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
5940: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
5950: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
5960: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
5970: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5980: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
5990: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
59a0: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
59b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
59c0: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
59d0: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
59e0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
59f0: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
5a00: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
5a10: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
5a20: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
5a30: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
5a40: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
5a50: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
5a60: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
5a70: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
5a80: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
5a90: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
5aa0: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
5ab0: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5ac0: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5ad0: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
5ae0: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5af0: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
5b00: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
5b10: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
5b20: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
5b30: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
5b40: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
5b50: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
5b60: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
5b70: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
5b80: 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62  lgrind..**.** Ab
5b90: 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53  out the #ifdef S
5ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5bb0: 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  :  Normally, thi
5bc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
5bd0: 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c  er called.** unl
5be0: 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54  ess p->nOp>0.  T
5bf0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
5c00: 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66  n the absense of
5c10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5c20: 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61  CE,.** an OP_Tra
5c30: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ce instruction i
5c40: 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65  s always inserte
5c50: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
5c60: 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73  Get() as soon as
5c70: 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69  .** a new VDBE i
5c80: 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77  s created.  So w
5c90: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65  e are free to se
5ca0: 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70  t addr to p->nOp
5cb0: 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  -1 without.** ha
5cc0: 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63  ving to double-c
5cd0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5ce0: 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  e that the resul
5cf0: 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
5d00: 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c  e. But.** if SQL
5d10: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69  ITE_OMIT_TRACE i
5d20: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f  s defined, the O
5d30: 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74  P_Trace is omitt
5d40: 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65  ed and we do nee
5d50: 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68  d to.** check th
5d60: 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f  e value of p->nO
5d70: 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  p-1 before conti
5d80: 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70  nuing..*/.VdbeOp
5d90: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
5da0: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
5db0: 61 64 64 72 29 7b 0a 20 20 73 74 61 74 69 63 20  addr){.  static 
5dc0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 64 75 6d  const VdbeOp dum
5dd0: 6d 79 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 61 73  my = { 0 };.  as
5de0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5df0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5e00: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
5e10: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
5e20: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
5e30: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20  if( p->nOp==0 ) 
5e40: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
5e50: 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20  &dummy;.#endif. 
5e60: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
5e70: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
5e80: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
5e90: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
5ea0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5eb0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
5ec0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5ed0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
5ee0: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
5ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5f00: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
5f10: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  ];.  }.}..#if !d
5f20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5f30: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
5f40: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
5f50: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
5f60: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
5f70: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
5f80: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
5f90: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
5fa0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
5fb0: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
5fc0: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
5fd0: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
5fe0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
5ff0: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
6000: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
6010: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
6020: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
6030: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
6040: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
6050: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
6060: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
6070: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
6080: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
6090: 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
60a0: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  :.    case P4_KE
60b0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
60c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
60d0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
60e0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
60f0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
6100: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6110: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e  p, zTemp, "keyin
6120: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  fo(%d", pKeyInfo
6130: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
6140: 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
6150: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20  en30(zTemp);.   
6160: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
6170: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
6180: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
6190: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
61a0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
61b0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
61c0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
61d0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
61e0: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d  3Strlen30(pColl-
61f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
6200: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
6210: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
6220: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
6230: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20  i],",...",4);.  
6240: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6250: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6260: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
6270: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  ] = ',';.       
6280: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
6290: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70  >aSortOrder && p
62a0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
62b0: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
62c0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
62d0: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
62e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
62f0: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  mcpy(&zTemp[i], 
6300: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31  pColl->zName,n+1
6310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6320: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
6330: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
6340: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
6350: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
6360: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20  ,",nil",4);.    
6370: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
6380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6390: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
63a0: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
63b0: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
63c0: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
63d0: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
63e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
63f0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
6400: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6410: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
6420: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
6430: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6440: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
6450: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
6460: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
6470: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6480: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
6490: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
64a0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
64b0: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
64c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
64d0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
64e0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
64f0: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
6500: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6510: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6520: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
6530: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6540: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6550: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
6560: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
6570: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6580: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
6590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
65a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
65b0: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
65c0: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
65d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
65e0: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
65f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6600: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6610: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
6620: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
6630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6640: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
6650: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
6660: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
6670: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
6680: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
6690: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a  MEM_Null)==0 );.
66a0: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
66b0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
66c0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
66d0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
66e0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
66f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
6700: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6710: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6720: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
6730: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
6740: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
6750: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6760: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
6770: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6780: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6790: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29  %.16g", pMem->r)
67a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
67b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
67c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
67d0: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
67e0: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
67f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6800: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6810: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6820: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
6830: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
6840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
6850: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
6860: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
6870: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
6880: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6890: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
68a0: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
68b0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
68c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
68d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
68e0: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
68f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6900: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6910: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
6920: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6930: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6940: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
6950: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6960: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6970: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
6980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6990: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
69a0: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
69b0: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
69c0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
69d0: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
69e0: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
69f0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
6a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6a10: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
6a20: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
6a30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
6a40: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
6a50: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
6a60: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
6a70: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
6a80: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  ** The prepared 
6a90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 74 6f  statement has to
6aa0: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
6ab0: 20 77 68 69 63 68 20 42 74 72 65 65 20 6f 62 6a   which Btree obj
6ac0: 65 63 74 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ects.** will be 
6ad0: 75 73 65 64 20 73 6f 20 74 68 61 74 20 69 74 20  used so that it 
6ae0: 63 61 6e 20 61 63 71 75 69 72 65 20 6d 75 74 65  can acquire mute
6af0: 78 65 73 20 6f 6e 20 74 68 65 6d 20 61 6c 6c 20  xes on them all 
6b00: 69 6e 20 73 6f 72 74 65 64 0a 2a 2a 20 6f 72 64  in sorted.** ord
6b10: 65 72 20 28 76 69 61 20 73 71 6c 69 74 65 33 56  er (via sqlite3V
6b20: 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  dbeMutexArrayEnt
6b30: 65 72 28 29 2e 20 20 4d 75 74 65 78 65 73 20 61  er().  Mutexes a
6b40: 72 65 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 69  re acquired.** i
6b50: 6e 20 6f 72 64 65 72 20 28 61 6e 64 20 72 65 6c  n order (and rel
6b60: 65 61 73 65 64 20 69 6e 20 72 65 76 65 72 73 65  eased in reverse
6b70: 20 6f 72 64 65 72 29 20 74 6f 20 61 76 6f 69 64   order) to avoid
6b80: 20 64 65 61 64 6c 6f 63 6b 73 2e 0a 2a 2f 0a 76   deadlocks..*/.v
6b90: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
6ba0: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
6bb0: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20  , int i){.  int 
6bc0: 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20  mask;.  assert( 
6bd0: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
6be0: 3e 6e 44 62 20 26 26 20 69 3c 73 69 7a 65 6f 66  >nDb && i<sizeof
6bf0: 28 75 33 32 29 2a 38 20 29 3b 0a 20 20 61 73 73  (u32)*8 );.  ass
6c00: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
6c10: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
6c20: 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28  *8 );.  mask = (
6c30: 28 75 33 32 29 31 29 3c 3c 69 3b 0a 20 20 69 66  (u32)1)<<i;.  if
6c40: 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
6c50: 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
6c60: 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c    p->btreeMask |
6c70: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69  = mask;.    sqli
6c80: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
6c90: 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75  ayInsert(&p->aMu
6ca0: 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b  tex, p->db->aDb[
6cb0: 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  i].pBt);.  }.}..
6cc0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
6cd0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
6ce0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
6cf0: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
6d00: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
6d10: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
6d20: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
6d30: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
6d40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
6d50: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
6d60: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
6d70: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b  p){.  char *zP4;
6d80: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
6d90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
6da0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
6db0: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
6dc0: 20 25 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e   %4d %4d %-4s %.
6dd0: 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  2X %s\n";.  if( 
6de0: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
6df0: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d   stdout;.  zP4 =
6e00: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
6e10: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
6e20: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
6e30: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
6e40: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
6e50: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
6e60: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
6e70: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
6e80: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
6e90: 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  5,.#ifdef SQLITE
6ea0: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70  _DEBUG.      pOp
6eb0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70  ->zComment ? pOp
6ec0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a  ->zComment : "".
6ed0: 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23  #else.      "".#
6ee0: 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c  endif.  );.  ffl
6ef0: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
6f00: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
6f10: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
6f20: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
6f30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
6f40: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
6f50: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
6f60: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
6f70: 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20   Mem *pEnd;.    
6f80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
6f90: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  >db;.    u8 mall
6fa0: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
6fb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
6fc0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
6fd0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
6fe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
6ff0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
7000: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7010: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7020: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7030: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
7040: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
7050: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
7060: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
7070: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
7080: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
7090: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
70a0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
70b0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
70c0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
70d0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
70e0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
70f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7100: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7110: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7120: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7130: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7140: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7150: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7160: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7170: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7180: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
7190: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
71a0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
71b0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
71c0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
71d0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
71e0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
71f0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7200: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7210: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7220: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7230: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7240: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7250: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7260: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7270: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7280: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
7290: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
72a0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
72b0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
72c0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
72d0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
72e0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
72f0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7300: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7310: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7320: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7330: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7340: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7350: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7360: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7370: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7380: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7390: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
73a0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
73b0: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
73c0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
73d0: 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  }.    db->malloc
73e0: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
73f0: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
7400: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
7410: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
7420: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
7430: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7440: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
7450: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
7460: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
7470: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
7480: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7490: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
74a0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
74b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
74c0: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
74d0: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
74e0: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
74f0: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
7500: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
7510: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
7520: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
7530: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
7540: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
7550: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
7560: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
7570: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
7580: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
7590: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
75a0: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
75b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
75c0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
75d0: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
75e0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
75f0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
7600: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
7610: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
7620: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
7630: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
7640: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
7650: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
7660: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
7670: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
7680: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
7690: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
76a0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
76b0: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
76c0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
76d0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
76e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
76f0: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
7700: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
7710: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
7720: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
7730: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
7740: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
7750: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
7760: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
7770: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
7780: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
7790: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
77a0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
77b0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
77c0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
77d0: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
77e0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
77f0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
7800: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
7810: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
7820: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
7830: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
7860: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
7890: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
78a0: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
78b0: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
78e0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
78f0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
7900: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
7910: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7920: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
7930: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
7940: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
7970: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
7980: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
7990: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
79a0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
79b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
79c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
79d0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7a00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
7a10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7a30: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
7a40: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
7a50: 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74   = p->pResultSet
7a60: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
7a70: 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66   /* First Mem of
7a80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
7a90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
7aa0: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
7ab0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
7ac0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
7ad0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
7ae0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
7af0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
7b00: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
7b10: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
7b20: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
7b30: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
7b40: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
7b50: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
7b60: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
7b70: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
7b80: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
7b90: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
7ba0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
7bb0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
7bc0: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
7bd0: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
7be0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
7bf0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
7c00: 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  , 8);..  if( p->
7c10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
7c20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
7c30: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
7c40: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
7c50: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
7c60: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
7c70: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
7c80: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
7c90: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
7ca0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7cb0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
7cc0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7cd0: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
7ce0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
7cf0: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
7d00: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
7d10: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
7d20: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
7d30: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
7d40: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
7d50: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
7d60: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
7d70: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
7d80: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
7d90: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
7da0: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
7db0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
7dc0: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
7dd0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
7de0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
7df0: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
7e00: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
7e10: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
7e20: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
7e30: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
7e40: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
7e50: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
7e60: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
7e70: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
7e80: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
7e90: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
7ea0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
7eb0: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
7ec0: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
7ed0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
7ee0: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
7ef0: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
7f00: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
7f10: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
7f20: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
7f30: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
7f40: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
7f50: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
7f60: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
7f70: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
7f80: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
7f90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
7fa0: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
7fb0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
7fc0: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
7fd0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
7fe0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
7ff0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
8000: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
8010: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
8020: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
8030: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
8040: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
8050: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
8060: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
8070: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
8080: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
8090: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
80a0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
80b0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
80c0: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
80d0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
80e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
80f0: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
8100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
8110: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
8120: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
8130: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
8140: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
8150: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
8160: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
8170: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
8180: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
8190: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
81a0: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
81b0: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
81c0: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
81d0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
81e0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
81f0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
8200: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
8210: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
8220: 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
8230: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
8240: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8250: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20  char *z;.    Op 
8260: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
8270: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
8280: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
8290: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
82a0: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
82b0: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
82c0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
82d0: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
82e0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
82f0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
8300: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
8310: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
8320: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
8330: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
8340: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
8350: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
8360: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
8370: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
8380: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
8390: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
83a0: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
83b0: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
83c0: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
83d0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
83e0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
83f0: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
8400: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
8410: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
8420: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8430: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
8440: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
8450: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
8460: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
8470: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
84a0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  nter */.      pM
84b0: 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70  em++;.  .      p
84c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
84d0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
84e0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
84f0: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
8500: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
8510: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
8520: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
8530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
8540: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
8550: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
8560: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
8570: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
8580: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
8590: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
85a0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
85b0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
85c0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
85d0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
85e0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
85f0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
8600: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
8610: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
8620: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
8630: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
8640: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
8650: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
8660: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
8670: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
8680: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
8690: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
86a0: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
86b0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
86c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
86d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
86e0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
86f0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
8700: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
8710: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
8720: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
8730: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
8740: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
8750: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
8760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8770: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
8780: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
8790: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
87a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
87b0: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
87c0: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
87d0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
87e0: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
87f0: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
8800: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
8810: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
8820: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
8830: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
8840: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
8850: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
8860: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
8870: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
8880: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
8890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
88a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
88b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
88c0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
88d0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
8900: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
8910: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
8920: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
8930: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8940: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
8950: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
8980: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
8990: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
89a0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
89b0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
89c0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
89d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
89e0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
89f0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
8a20: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
8a30: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
8a40: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  GER;.      pMem+
8a50: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
8a60: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
8a70: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
8a80: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
8a90: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
8aa0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
8ab0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8ac0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8ad0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
8ae0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8af0: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
8b00: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
8b10: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
8b20: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
8b30: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
8b40: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
8b50: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
8b60: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
8b70: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
8b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b90: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8ba0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8bb0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8bc0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8bd0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8be0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8bf0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
8c00: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
8c10: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
8c20: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8c30: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
8c40: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
8c50: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
8c60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
8c70: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
8c80: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8c90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8ca0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
8cb0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8cc0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
8cd0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
8ce0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
8cf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8d00: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
8d10: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
8d20: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
8d30: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
8d40: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
8d50: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
8d60: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
8d70: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
8d80: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
8d90: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
8da0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
8db0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
8dc0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
8dd0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
8de0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
8df0: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
8e00: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
8e10: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
8e20: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
8e30: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8e40: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
8e50: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8e60: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d  TE_TEXT;.      }
8e70: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
8e80: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    {.        pMem
8e90: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
8ea0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
8ec0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
8ed0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8ee0: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_NULL;.      
8ef0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  }.    }..    p->
8f00: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
8f10: 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   5*(p->explain-1
8f20: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  );.    p->rc = S
8f30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
8f40: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
8f50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8f60: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8f70: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
8f80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
8f90: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
8fa0: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
8fb0: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
8fc0: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
8fd0: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
8fe0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
8ff0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
9000: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
9010: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
9020: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
9030: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
9040: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
9050: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
9060: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
9070: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  z!=0 ){.    cons
9080: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
9090: 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65  >p4.z;.    while
90a0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
90b0: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
90c0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
90d0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
90e0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
90f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9100: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
9110: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9120: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
9130: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
9140: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
9150: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
9160: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9170: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
9180: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
9190: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
91a0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
91b0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
91c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
91d0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
91e0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
91f0: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
9200: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
9210: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
9220: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
9230: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
9240: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
9250: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
9260: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
9270: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
9280: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
9290: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
92a0: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
92b0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
92c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
92d0: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
92e0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
92f0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
9300: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
9310: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9330: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
9340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9350: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
9360: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
9370: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
9380: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
9390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
93a0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
93b0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
93c0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
93d0: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
93e0: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
93f0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
9400: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
9410: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
9420: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
9430: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
9440: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
9450: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
9460: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
9470: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
9480: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
9490: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
94a0: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
94b0: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
94c0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
94d0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
94e0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
94f0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
9500: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
9510: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
9520: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
9530: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
9540: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
9550: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
9560: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
9570: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
9580: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
9590: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
95a0: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
95b0: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
95c0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
95d0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
95e0: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
95f0: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
9600: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
9610: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
9620: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
9630: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
9640: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
9650: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
9660: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
9670: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
9680: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
9690: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
96a0: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
96b0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
96c0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
96d0: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
96e0: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
96f0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
9700: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
9710: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
9720: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
9730: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
9740: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
9750: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
9760: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
9770: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
9780: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
9790: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
97a0: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
97b0: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
97c0: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
97d0: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
97e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
97f0: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
9800: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
9810: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
9820: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
9830: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
9840: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
9850: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9860: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
9870: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
9880: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
9890: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
98a0: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
98b0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
98c0: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
98d0: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
98e0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
98f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
9900: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
9910: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
9920: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
9930: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
9940: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
9950: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
9960: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
9970: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
9980: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
9990: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
99a0: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
99b0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
99c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
99d0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
99e0: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
99f0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
9a00: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
9a10: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
9a20: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
9a30: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
9a40: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
9a50: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
9a60: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
9a70: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
9a80: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
9a90: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
9aa0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
9ab0: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
9ac0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
9ad0: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
9ae0: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
9af0: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
9b00: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20  AGIC_RUN..**.** 
9b10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
9b20: 79 20 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65  y be called more
9b30: 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20   than once on a 
9b40: 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d  single virtual m
9b50: 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66  achine..** The f
9b60: 69 72 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64  irst call is mad
9b70: 65 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e  e while compilin
9b80: 67 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  g the SQL statem
9b90: 65 6e 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a  ent. Subsequent.
9ba0: 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  ** calls are mad
9bb0: 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  e as part of the
9bc0: 20 70 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65   process of rese
9bd0: 74 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e  tting a statemen
9be0: 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78  t to be.** re-ex
9bf0: 65 63 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63  ecuted (from a c
9c00: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  all to sqlite3_r
9c10: 65 73 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61  eset()). The nVa
9c20: 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72  r, nMem, nCursor
9c30: 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61   .** and isExpla
9c40: 69 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  in parameters ar
9c50: 65 20 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f  e only passed co
9c60: 72 72 65 63 74 20 76 61 6c 75 65 73 20 74 68 65  rrect values the
9c70: 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74   first time.** t
9c80: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  he function is c
9c90: 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71  alled. On subseq
9ca0: 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d  uent calls, from
9cb0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
9cc0: 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73  , nVar.** is pas
9cd0: 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c  sed -1 and nMem,
9ce0: 20 6e 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45   nCursor and isE
9cf0: 78 70 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70  xplain are all p
9d00: 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76  assed zero..*/.v
9d10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
9d20: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
9d30: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9d50: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
9d60: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
9d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9d80: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
9d90: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
9da0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
9db0: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
9dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9dd0: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
9de0: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
9df0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9e20: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
9e30: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ate */.  int nAr
9e40: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
9e50: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
9e60: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
9e70: 73 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 73  s in SubPrograms
9e80: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
9e90: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
9ea0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
9eb0: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
9ec0: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
9ed0: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73 53 74 6d  */.  int usesStm
9ee0: 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20  tJournal        
9ef0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
9f00: 65 74 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74  et Vdbe.usesStmt
9f10: 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20  Journal */.){.  
9f20: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
9f30: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
9f40: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
9f50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
9f60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
9f70: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
9f80: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
9f90: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
9fa0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9fb0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
9fc0: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
9fd0: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
9fe0: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
9ff0: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
a000: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
a010: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
a020: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
a030: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
a040: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
a050: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
a060: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
a070: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
a080: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
a090: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
a0a0: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
a0b0: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
a0c0: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
a0d0: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
a0e0: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
a0f0: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
a100: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
a110: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
a120: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a130: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
a140: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
a150: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
a160: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
a170: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
a180: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
a190: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
a1a0: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
a1b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
a1c0: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
a1d0: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
a1e0: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
a1f0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
a200: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
a210: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
a220: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
a230: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
a240: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
a250: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
a260: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20  n arguments in. 
a270: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e  This is only don
a280: 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  e the.  ** first
a290: 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74   time this funct
a2a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ion is called fo
a2b0: 72 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20  r a given VDBE, 
a2c0: 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20  not when it is. 
a2d0: 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   ** being called
a2e0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
a2f0: 73 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74  set() to reset t
a300: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a310: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
a320: 56 61 72 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Var>=0 && ALWAYS
a330: 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
a340: 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75 38 20  d==0) ){.    u8 
a350: 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a 29 26 70  *zCsr = (u8 *)&p
a360: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
a370: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
a380: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
a390: 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 75 38  oation */.    u8
a3a0: 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29 26   *zEnd = (u8 *)&
a3b0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c  p->aOp[p->nOpAll
a3c0: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
a3d0: 79 74 65 20 70 61 73 74 20 61 76 61 69 6c 61 62  yte past availab
a3e0: 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  le mem */.    in
a3f0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
a420: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 6e  h extra memory n
a430: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 20 20 72 65  eeded */..    re
a440: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
a450: 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e   &nArg);.    p->
a460: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a470: 3d 20 28 75 38 29 75 73 65 73 53 74 6d 74 4a 6f  = (u8)usesStmtJo
a480: 75 72 6e 61 6c 3b 0a 20 20 20 20 69 66 28 20 69  urnal;.    if( i
a490: 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  sExplain && nMem
a4a0: 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65  <10 ){.      nMe
a4b0: 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  m = 10;.    }.  
a4c0: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
a4d0: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
a4e0: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
a4f0: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20  - (u8*)0)&7;.   
a500: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a510: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
a520: 73 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  sr) );..    /* M
a530: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
a540: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
a550: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
a560: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
a570: 6f 0a 20 20 20 20 2a 2a 20 70 61 73 73 65 73 2e  o.    ** passes.
a580: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
a590: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
a5a0: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
a5b0: 65 20 61 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  e at the .    **
a5c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
a5d0: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
a5e0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
a5f0: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
a600: 79 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  y.    ** require
a610: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
a620: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
a630: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
a640: 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70   second.    ** p
a650: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
a660: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
a670: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
a680: 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  on.  .    **.   
a690: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
a6a0: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
a6b0: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
a6c0: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
a6d0: 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  e from.    ** th
a6e0: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
a6f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
a700: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
a710: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
a720: 79 0a 20 20 20 20 2a 2a 20 72 65 64 75 63 65 20  y.    ** reduce 
a730: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
a740: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
a750: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a760: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  t..    */.    do
a770: 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d   {.      nByte =
a780: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65   0;.      p->aMe
a790: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
a7a0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
a7b0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
a7c0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a7d0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
a7e0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
a7f0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
a800: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
a810: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
a820: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
a830: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
a840: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
a850: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
a860: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
a870: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
a880: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
a890: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
a8a0: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
a8b0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
a8c0: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
a8d0: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
a8e0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
a8f0: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
a920: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a930: 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 20        if( nByte 
a940: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 46  ){.        p->pF
a950: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
a960: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
a970: 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  yte);.      }.  
a980: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
a990: 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20  ree;.      zEnd 
a9a0: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
a9b0: 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74      }while( nByt
a9c0: 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  e && !db->malloc
a9d0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70  Failed );..    p
a9e0: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36  ->nCursor = (u16
a9f0: 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  )nCursor;.    if
aa00: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
aa10: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
aa20: 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 20 20  Var)nVar;.      
aa30: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
aa40: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
aa50: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
aa60: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
aa70: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
aa80: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
aa90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
aaa0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70  >aMem ){.      p
aab0: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aad0: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
aae0: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
aaf0: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
ab00: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
ab10: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
ab20: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
ab30: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31  */.      for(n=1
ab40: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
ab50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
ab60: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
ab70: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
ab80: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
ab90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
aba0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
abb0: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d  E_DEBUG.  for(n=
abc0: 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  1; n<p->nMem; n+
abd0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
abe0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64  p->aMem[n].db==d
abf0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
ac00: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
ac10: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
ac20: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
ac30: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
ac40: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
ac50: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
ac60: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
ac70: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
ac80: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
ac90: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
aca0: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
acb0: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
acc0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
acd0: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
ace0: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
acf0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
ad00: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ad10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ad20: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
ad30: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
ad40: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  0;.      p->aOp[
ad50: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
ad60: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
ad70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ad80: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
ad90: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
ada0: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
adb0: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
adc0: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
add0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
ade0: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
adf0: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
ae00: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
ae10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
ae20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
ae30: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
ae40: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
ae50: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
ae60: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
ae70: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
ae80: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
ae90: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
aea0: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
aeb0: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
aec0: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
aed0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
aee0: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
aef0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
af00: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
af10: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
af20: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
af30: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
af40: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
af50: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
af60: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
af70: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
af80: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
af90: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e  *pModule = pCx->
afa0: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
afb0: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
afc0: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
afd0: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
afe0: 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  r);.    p->inVta
aff0: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
b000: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b010: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
b020: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
b030: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
b040: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
b050: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
b060: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
b070: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
b080: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
b090: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
b0a0: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
b0b0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
b0c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
b0d0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
b0e0: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
b0f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
b100: 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70  ame->v;.  v->aOp
b110: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
b120: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
b130: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
b140: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
b150: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
b160: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
b170: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
b180: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
b190: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
b1a0: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
b1b0: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
b1c0: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
b1d0: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
b1e0: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
b1f0: 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
b200: 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
b210: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
b220: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
b230: 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
b240: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
b250: 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
b260: 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
b270: 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
b280: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
b290: 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
b2a0: 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
b2b0: 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
b2c0: 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
b2d0: 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
b2e0: 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
b2f0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
b300: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
b310: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
b320: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
b330: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
b340: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
b350: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20  beFrame *pFrame 
b360: 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20  = p->pFrame;.   
b370: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
b380: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
b390: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
b3a0: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
b3b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b3c0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
b3d0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
b3e0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
b3f0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
b400: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
b410: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
b420: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
b430: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
b440: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
b450: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
b460: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
b470: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b480: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
b490: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
b4a0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
b4b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b4c0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
b4d0: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
b4e0: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
b4f0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
b500: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
b510: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
b520: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
b530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
b540: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
b550: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
b560: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
b570: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
b580: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
b590: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
b5a0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
b5b0: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
b5c0: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
b5d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b5e0: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
b5f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
b600: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
b610: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
b620: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
b630: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
b640: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
b650: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
b660: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
b670: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
b680: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
b690: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
b6a0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
b6b0: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
b6c0: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
b6d0: 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e  >apCsr==0 || p->
b6e0: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
b6f0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
b700: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
b710: 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c  t( p->aMem==0 ||
b720: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
b730: 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23  s==MEM_Null );.#
b740: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
b750: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
b760: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
b770: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
b780: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
b790: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b7a0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
b7b0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
b7c0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
b7d0: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
b7e0: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
b7f0: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
b800: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
b810: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
b820: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
b830: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
b840: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
b850: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
b860: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
b870: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
b880: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
b890: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
b8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
b8b0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
b8c0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
b8d0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
b8e0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
b8f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
b900: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
b910: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
b920: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
b930: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
b940: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b950: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
b960: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
b970: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
b980: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
b990: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
b9a0: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
b9b0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
b9c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
b9d0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
b9e0: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
b9f0: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
ba00: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
ba10: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
ba20: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
ba30: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
ba40: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
ba50: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
ba60: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
ba70: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
ba80: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
ba90: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
baa0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
bab0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
bac0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
bad0: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
bae0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
baf0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
bb00: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
bb10: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
bb20: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
bb30: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
bb40: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
bb50: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
bb60: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
bb70: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
bb80: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
bb90: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
bba0: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
bbb0: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
bbc0: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
bbd0: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
bbe0: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
bbf0: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
bc00: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
bc10: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
bc20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
bc30: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
bc60: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
bc70: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bca0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
bcb0: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
bcc0: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
bcf0: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
bd00: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
bd10: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
bd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
bd30: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
bd40: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
bd50: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
bd60: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
bd70: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
bd80: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
bd90: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
bda0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
bdb0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
bdc0: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
bdd0: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
bde0: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
bdf0: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
be00: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
be10: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
be20: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
be30: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
be40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
be50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
be60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
be70: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
be80: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
be90: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
bea0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
beb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
bec0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
bed0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
bee0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
bef0: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
bf00: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
bf10: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
bf20: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
bf30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bf40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
bf50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
bf60: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
bf70: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
bf80: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
bf90: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
bfa0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
bfb0: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
bfc0: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
bfd0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
bfe0: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
bff0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
c000: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
c010: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
c020: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
c030: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
c040: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
c050: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
c060: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
c070: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
c080: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
c090: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
c0a0: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
c0b0: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
c0c0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
c0d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c0e0: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
c0f0: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
c100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
c110: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
c120: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
c130: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
c140: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
c150: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
c160: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
c170: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
c180: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c190: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
c1a0: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
c1b0: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
c1c0: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
c1d0: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
c1e0: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
c1f0: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
c200: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
c210: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
c220: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
c230: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
c240: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
c250: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c260: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
c270: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
c280: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
c290: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
c2a0: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
c2b0: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
c2c0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
c2d0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
c2e0: 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  (db, &p->zErrMsg
c2f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c300: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
c310: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
c320: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
c330: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
c340: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
c350: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
c360: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
c370: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
c380: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
c390: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
c3a0: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
c3b0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
c3c0: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
c3d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
c3e0: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
c3f0: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
c400: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
c410: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
c420: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
c430: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
c440: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
c450: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
c460: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
c470: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
c480: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
c490: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
c4a0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
c4b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
c4c0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
c4d0: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
c4e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
c4f0: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
c500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c510: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
c520: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
c530: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
c540: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
c550: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
c560: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
c570: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
c580: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
c590: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
c5a0: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
c5b0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
c5c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c5d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
c5e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
c5f0: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
c600: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
c610: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c620: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
c630: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
c640: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
c650: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
c660: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
c670: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
c680: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
c690: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
c6a0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
c6b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
c6c0: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
c6d0: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
c6e0: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
c6f0: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
c700: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
c710: 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
c720: 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
c730: 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
c740: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
c750: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
c760: 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
c770: 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
c780: 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
c790: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
c7a0: 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
c7b0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
c7c0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
c7d0: 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
c7e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
c7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c800: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
c810: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
c820: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
c830: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
c840: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
c850: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
c860: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
c870: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
c880: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
c890: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
c8a0: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
c8b0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
c8c0: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
c8d0: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
c8e0: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
c8f0: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
c900: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
c910: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
c920: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
c930: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
c940: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
c950: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
c960: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
c970: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
c980: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
c990: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
c9a0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
c9b0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
c9c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
c9d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
c9e0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
c9f0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ca00: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ca10: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ca20: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ca30: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ca40: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
ca50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ca60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ca70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
ca80: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
ca90: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
caa0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
cab0: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
cac0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
cad0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
cae0: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
caf0: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
cb00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cb10: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
cb20: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
cb30: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
cb40: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  icly..  */.#ifnd
cb50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
cb60: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
cb70: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
cb80: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
cb90: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
cba0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
cbb0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
cbc0: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
cbd0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cbe0: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
cbf0: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
cc00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
cc10: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
cc20: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
cc30: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
cc40: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
cc50: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
cc60: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20    int res;..    
cc70: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
cc80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cc90: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  name */.    do {
cca0: 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
ccb0: 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  om;.      sqlite
ccc0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
ccd0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
cce0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ccf0: 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
cd00: 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
cd10: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
cd20: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
cd30: 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e  s-mj%08X", zMain
cd40: 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78  File, iRandom&0x
cd50: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
cd60: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
cd70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cd80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
cda0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
cdb0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
cdc0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
cdd0: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
cde0: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
cdf0: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
ce00: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ce10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ce20: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
ce30: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
ce40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ce50: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
ce60: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
ce70: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
ce80: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
ce90: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
cea0: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
ceb0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
cec0: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
ced0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
cee0: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
cef0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cf00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cf10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
cf20: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
cf30: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
cf40: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
cf50: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
cf60: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
cf70: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
cf80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
cf90: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
cfa0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cfb0: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
cfc0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
cfd0: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
cfe0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
cff0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d000: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
d010: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
d020: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
d030: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
d040: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
d050: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
d060: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
d070: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
d080: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
d090: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
d0a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d0b0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
d0c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
d0d0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
d0e0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
d0f0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
d100: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
d110: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
d120: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
d130: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
d140: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
d150: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
d160: 3d 30 20 7c 7c 20 7a 46 69 6c 65 5b 30 5d 3d 3d  =0 || zFile[0]==
d170: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
d180: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
d190: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
d1a0: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
d1b0: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
d1c0: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
d1d0: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
d1e0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
d1f0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
d200: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
d210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d220: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d230: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
d240: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
d250: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
d260: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
d270: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
d280: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
d290: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
d2a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d2c0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
d2d0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
d2e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
d2f0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
d300: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d310: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d320: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
d330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
d340: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d350: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
d360: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
d370: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d380: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
d390: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
d3a0: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
d3b0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
d3c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
d3d0: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
d3e0: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
d3f0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
d400: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
d410: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
d420: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
d430: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
d440: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
d450: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
d460: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
d470: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
d480: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
d490: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
d4a0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
d4b0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
d4c0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d4d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
d4e0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
d4f0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
d500: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
d510: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
d520: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
d530: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
d540: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
d550: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
d560: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
d570: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
d580: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
d590: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
d5a0: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
d5b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
d5c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
d5d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
d5e0: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
d5f0: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
d600: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
d610: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
d620: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
d630: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
d640: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
d650: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
d660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
d670: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
d680: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
d690: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
d6a0: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
d6b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d6c0: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
d6d0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
d6e0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
d6f0: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
d700: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
d710: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
d720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
d730: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
d740: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
d750: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
d760: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
d770: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d780: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
d790: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
d7a0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
d7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
d7c0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
d7d0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  pMaster);.    if
d7e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d7f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d800: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
d810: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
d820: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
d830: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
d840: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d850: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
d860: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d870: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
d880: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
d890: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
d8a0: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
d8b0: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
d8c0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
d8d0: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
d8e0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
d8f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
d900: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
d910: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
d920: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
d930: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
d940: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
d950: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
d960: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
d970: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
d980: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
d990: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
d9a0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
d9b0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
d9c0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
d9d0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d9e0: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
d9f0: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
da00: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
da10: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
da20: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
da30: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
da40: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
da50: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
da60: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
da70: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
da80: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
da90: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
daa0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
dab0: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
dac0: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
dad0: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
dae0: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
daf0: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
db00: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
db10: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
db20: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
db30: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
db40: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
db50: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
db60: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
db70: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
db80: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
db90: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
dba0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
dbb0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
dbc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
dbd0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
dbe0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dbf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
dc00: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
dc10: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
dc20: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
dc30: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
dc40: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
dc50: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
dc60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
dc70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
dc80: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
dc90: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
dca0: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
dcb0: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
dcc0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
dcd0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
dce0: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
dcf0: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
dd00: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
dd10: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
dd20: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
dd30: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
dd40: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
dd50: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
dd60: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
dd70: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
dd80: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
dd90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
dda0: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
ddb0: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
ddc0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
ddd0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
dde0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
ddf0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
de00: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
de10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
de20: 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  te = 0;.  p = db
de30: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
de40: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
de50: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
de60: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
de70: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
de80: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
de90: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
dea0: 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Write++;.    }. 
deb0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
dec0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
ded0: 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64  nt==db->activeVd
dee0: 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  beCnt );.  asser
def0: 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77  t( nWrite==db->w
df00: 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  riteVdbeCnt );.}
df10: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
df20: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
df30: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
df40: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
df50: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
df60: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
df70: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
df80: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
df90: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
dfa0: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
dfb0: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
dfc0: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
dfd0: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
dfe0: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
dff0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
e000: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
e010: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
e020: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
e030: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
e040: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
e050: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
e060: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
e070: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
e080: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
e090: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
e0a0: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
e0b0: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
e0c0: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
e0d0: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
e0e0: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
e0f0: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
e100: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
e110: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
e120: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
e130: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
e140: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
e150: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
e160: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
e170: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
e180: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
e190: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
e1a0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
e1b0: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
e1c0: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
e1d0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
e1e0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
e1f0: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
e200: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
e210: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
e220: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
e230: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
e240: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
e250: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e260: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
e270: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e280: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
e290: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
e2a0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
e2b0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
e2c0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
e2d0: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
e2e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
e2f0: 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
e300: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
e310: 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
e320: 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
e330: 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
e340: 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
e350: 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
e360: 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
e370: 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
e380: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
e390: 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
e3a0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
e3b0: 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
e3c0: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
e3d0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
e3e0: 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
e3f0: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
e400: 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
e410: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
e420: 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a   is commtted..**
e430: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
e440: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
e450: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
e460: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
e470: 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
e480: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
e490: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
e4a0: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
e4b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
e4c0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
e4d0: 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
e4e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e4f0: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
e500: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73  p->iStatement is
e510: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
e520: 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64  ro, then this Vd
e530: 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a  be opened a .  *
e540: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
e550: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f  saction that sho
e560: 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65  uld be closed he
e570: 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63  re. The only exc
e580: 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74  eption.  ** is t
e590: 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hat an IO error 
e5a0: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 64  may have occured
e5b0: 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65  , causing an eme
e5c0: 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e  rgency rollback.
e5d0: 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  .  ** In this ca
e5e0: 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  se (db->nStateme
e5f0: 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72  nt==0), and ther
e600: 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
e610: 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  do..  */.  if( d
e620: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
e630: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
e640: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
e650: 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
e660: 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
e670: 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73  ement-1;..    as
e680: 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50  sert( eOp==SAVEP
e690: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  OINT_ROLLBACK ||
e6a0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
e6b0: 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73  RELEASE);.    as
e6c0: 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
e6d0: 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73  ment>0 );.    as
e6e0: 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
e6f0: 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
e700: 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
e710: 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  int) );..    for
e720: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
e730: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
e740: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
e750: 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  K;.      Btree *
e760: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e770: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
e780: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pBt ){.        i
e790: 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
e7a0: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
e7b0: 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
e7c0: 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
e7d0: 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
e7e0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
e7f0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
e800: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
e810: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
e820: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
e830: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
e840: 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
e850: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
e860: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
e870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e880: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
e8a0: 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20   = rc2;.        
e8b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
e8c0: 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
e8d0: 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74  nt--;.    p->iSt
e8e0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
e8f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
e900: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
e910: 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
e920: 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
e930: 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  tore the .    **
e940: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e950: 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
e960: 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
e970: 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
e980: 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d when .    ** t
e990: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
e9a0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
e9b0: 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ned.  */.    if(
e9c0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
e9d0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
e9e0: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
e9f0: 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
ea00: 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  fCons;.    }.  }
ea10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ea20: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
ea30: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
ea40: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
ea50: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
ea60: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
ea70: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
ea80: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
ea90: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
eaa0: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
eab0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
eac0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
ead0: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
eae0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
eaf0: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
eb00: 74 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  t.** sets the Bt
eb10: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
eb20: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
eb30: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
eb40: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
eb50: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
eb60: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
eb70: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
eb80: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
eb90: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
eba0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
ebb0: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
ebc0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
ebd0: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
ebe0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
ebf0: 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20  ll() is invoked 
ec00: 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61  to set the BtSha
ec10: 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73  red.db variables
ec20: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74  .** of all of Bt
ec30: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
ec40: 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61  s accessible via
ec50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
ec60: 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61  ndle .** associa
ec70: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e  ted with the VM.
ec80: 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79 20   Of course only 
ec90: 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 73  a subset of thes
eca0: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
ecb0: 77 69 6c 6c 20 62 65 20 61 63 63 65 73 73 65 64  will be accessed
ecc0: 20 62 79 20 74 68 65 20 56 4d 2c 20 61 6e 64 20   by the VM, and 
ecd0: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 56 64 62  we could use Vdb
ece0: 65 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f 20 66  e.btreeMask to f
ecf0: 69 67 75 72 65 0a 2a 2a 20 74 68 61 74 20 73 75  igure.** that su
ed00: 62 73 65 74 20 6f 75 74 2c 20 62 75 74 20 74 68  bset out, but th
ed10: 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74  ere is no advant
ed20: 61 67 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f 2e  age to doing so.
ed30: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
ed40: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
ed50: 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  fe and does not 
ed60: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
ed70: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a  ache mode, this.
ed80: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
ed90: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64   no-op..*/.#ifnd
eda0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
edb0: 48 41 52 45 44 5f 43 41 43 48 45 0a 76 6f 69 64  HARED_CACHE.void
edc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65   sqlite3VdbeMute
edd0: 78 41 72 72 61 79 45 6e 74 65 72 28 56 64 62 65  xArrayEnter(Vdbe
ede0: 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
edf0: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 73 71  _THREADSAFE.  sq
ee00: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
ee10: 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d  rrayEnter(&p->aM
ee20: 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20 73  utex);.#else.  s
ee30: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
ee40: 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e 64  All(p->db);.#end
ee50: 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  if.}.#endif../*.
ee60: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ee70: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
ee80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  a transaction op
ee90: 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61  ened by the data
eea0: 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  base .** handle 
eeb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
eec0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
eed0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20   an argument is 
eee0: 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20  about to be .** 
eef0: 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68  committed. If th
ef00: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
ef10: 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72  ing deferred for
ef20: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
ef30: 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e  int.** violation
ef40: 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
ef50: 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73  _ERROR. Otherwis
ef60: 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
ef70: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
ef80: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20   outstanding FK 
ef90: 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74  violations and t
efa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
efb0: 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
efc0: 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72  ERROR, set the r
efd0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20  esult of the VM 
efe0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  to SQLITE_CONSTR
eff0: 41 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a  AINT and write.*
f000: 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  * an error messa
f010: 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
f020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
f030: 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
f040: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
f050: 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
f060: 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
f070: 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
f080: 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
f090: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
f0a0: 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
f0b0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
f0c0: 73 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72  s>0) || (!deferr
f0d0: 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
f0e0: 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20  traint>0) ){.   
f0f0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
f100: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
f110: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
f120: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
f130: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
f140: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
f150: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   "foreign key co
f160: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
f170: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
f180: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
f190: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f1a0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
f1b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f1c0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
f1d0: 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
f1e0: 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
f1f0: 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
f200: 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
f210: 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
f220: 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
f230: 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
f240: 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
f250: 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
f260: 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
f270: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
f280: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
f290: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
f2a0: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
f2b0: 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
f2c0: 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
f2d0: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
f2e0: 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
f2f0: 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
f300: 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
f310: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
f320: 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
f330: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
f340: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
f350: 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
f360: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
f370: 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
f380: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
f390: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
f3a0: 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
f3b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
f3c0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
f3d0: 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
f3e0: 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
f3f0: 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
f400: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
f410: 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
f420: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
f450: 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
f460: 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
f470: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
f480: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
f490: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
f4a0: 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
f4b0: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
f4c0: 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
f4d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
f4e0: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
f4f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
f500: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
f510: 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
f520: 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
f530: 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
f540: 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
f550: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
f560: 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
f570: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
f580: 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
f590: 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
f5a0: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
f5b0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
f5c0: 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
f5d0: 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
f5e0: 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
f5f0: 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
f600: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
f610: 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
f620: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
f630: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
f640: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
f650: 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
f660: 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
f670: 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
f680: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
f690: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f6a0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
f6b0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
f6c0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
f6d0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
f6e0: 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  EM;.  }.  closeA
f6f0: 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
f700: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
f710: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
f720: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f730: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
f740: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
f750: 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
f760: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
f770: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
f780: 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
f790: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
f7a0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  pc>=0 ){.    int
f7b0: 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
f7c0: 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
f7d0: 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
f7e0: 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
f7f0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
f800: 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
f810: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
f820: 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
f830: 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
f840: 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
f850: 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
f860: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
f870: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f880: 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28  MutexArrayEnter(
f890: 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
f8a0: 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
f8b0: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
f8c0: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
f8d0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  rc & 0xff;.    a
f8e0: 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
f8f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
f900: 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65  ED );  /* This e
f910: 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65  rror no longer e
f920: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53  xists */.    isS
f930: 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
f940: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
f950: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
f960: 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
f970: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
f980: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
f990: 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
f9a0: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
f9b0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
f9c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
f9d0: 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
f9e0: 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64  -only, we need d
f9f0: 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74  o no rollback at
fa00: 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c   all. Otherwise,
fa10: 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65  .      ** procee
fa20: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
fa30: 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
fa40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
fa50: 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
fa60: 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
fa70: 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
fa80: 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
fa90: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
faa0: 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
fab0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
fac0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
fad0: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
fae0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
faf0: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
fb00: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
fb10: 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
fb20: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
fb30: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
fb40: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
fb50: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
fb60: 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
fb70: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
fb80: 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
fb90: 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
fba0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
fbb0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
fbc0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
fbd0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
fbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
fbf0: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
fc00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
fc10: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
fc20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
fc30: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
fc40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fc50: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
fc60: 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
fc70: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
fc80: 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
fc90: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
fca0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fcb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
fcc0: 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
fcd0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
fce0: 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
fcf0: 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
fd00: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
fd10: 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
fd20: 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
fd30: 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
fd40: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
fd50: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
fd60: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
fd70: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
fd80: 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
fd90: 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
fda0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
fdb0: 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
fdc0: 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
fdd0: 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
fde0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
fdf0: 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
fe00: 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
fe10: 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
fe20: 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
fe30: 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
fe40: 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
fe50: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
fe60: 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
fe70: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
fe80: 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
fe90: 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
fea0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
feb0: 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 20 29 7b  CheckFk(p, 1) ){
fec0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fed0: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
fee0: 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65  yLeave(&p->aMute
fef0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  x);.          re
ff00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ff10: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
ff20: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
ff30: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
ff40: 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70  true, the vdbe p
ff50: 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65  rogram was succe
ff60: 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 2a  ssful .        *
ff70: 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
ff80: 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
ff90: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
ffa0: 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
ffb0: 67 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  gn.        ** ke
ffc0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
ffd0: 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
ffe0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
fff0: 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
10000 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
10010 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
10020 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
10030 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
10040 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10050 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
10060 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10070 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28  MutexArrayLeave(
10080 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20  &p->aMutex);.   
10090 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
100a0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
100b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
100c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
100d0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
100e0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
100f0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10100 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (db);.        }e
10110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
10120 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
10130 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10140 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
10150 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
10160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10180 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10190 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
101a0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
101b0 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
101c0 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
101d0 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
101e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
101f0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
10200 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10210 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
10220 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
10230 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
10240 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10250 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
10260 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
10270 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
10280 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
10290 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
102a0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  e{.        inval
102b0 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
102c0 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
102d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
102e0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
102f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10300 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
10310 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
10320 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
10330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10340 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
10350 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
10360 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
10370 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10380 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
10390 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
103a0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
103b0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
103c0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
103d0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
103e0 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
103f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
10400 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
10410 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
10420 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
10430 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
10440 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
10450 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
10460 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
10470 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
10480 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
10490 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
104a0 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  hat sqlite3VdbeC
104b0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
104c0 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66  can only fail if
104d0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20   eStatementOp.  
104e0 20 20 2a 2a 20 69 73 20 53 41 56 45 50 4f 49 4e    ** is SAVEPOIN
104f0 54 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 42 75 74  T_ROLLBACK.  But
10500 20 69 66 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   if p->rc==SQLIT
10510 45 5f 4f 4b 20 74 68 65 6e 20 65 53 74 61 74 65  E_OK then eState
10520 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20 6d 75  mentOp.    ** mu
10530 73 74 20 62 65 20 53 41 56 45 50 4f 49 4e 54 5f  st be SAVEPOINT_
10540 52 45 4c 45 41 53 45 2e 20 20 48 65 6e 63 65 20  RELEASE.  Hence 
10550 74 68 65 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d  the NEVER(p->rc=
10560 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 69 6e 20 0a  =SQLITE_OK) in .
10570 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
10580 77 69 6e 67 20 63 6f 64 65 2e 0a 20 20 20 20 2a  wing code..    *
10590 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
105a0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
105b0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
105c0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
105d0 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
105e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
105f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10600 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 53   eStatementOp==S
10610 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10620 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  K );.        if(
10630 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51   NEVER(p->rc==SQ
10640 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72  LITE_OK) || p->r
10650 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
10660 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
10670 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
10680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
10690 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
106a0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
106b0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
106c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
106d0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
106e0 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
106f0 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
10700 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10710 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10720 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
10730 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
10740 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
10750 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
10760 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
10770 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
10780 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
10790 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
107a0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
107b0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
107c0 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
107d0 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
107e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
107f0 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
10800 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
10810 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
10820 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
10830 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
10840 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10850 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10860 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
10870 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
10880 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
108a0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
108b0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
108c0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
108d0 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
108e0 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63  /* Rollback or c
108f0 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61  ommit any schema
10900 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63   changes that oc
10910 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  curred. */.    i
10920 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
10930 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73  _OK && db->flags
10940 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
10950 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73  anges ){.      s
10960 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
10970 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
10980 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
10990 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
109a0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
109b0 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  anges);.    }.. 
109c0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
109d0 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
109e0 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
109f0 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
10a00 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Mutex);.  }..  /
10a10 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
10a20 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
10a30 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
10a40 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
10a50 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
10a60 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
10a70 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
10a80 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
10a90 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
10aa0 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10ab0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  --;.    }.    as
10ac0 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
10ad0 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69  VdbeCnt>=db->wri
10ae0 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d  teVdbeCnt );.  }
10af0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
10b00 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
10b10 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10b20 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
10b30 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10b40 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
10b50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
10b60 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10b70 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
10b80 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
10b90 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
10ba0 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
10bb0 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
10bc0 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
10bd0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
10be0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
10bf0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
10c00 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
10c10 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
10c20 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
10c30 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
10c40 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
10c50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
10c60 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
10c70 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
10c80 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
10c90 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61  beCnt>0 || db->a
10ca0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
10cb0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
10cc0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
10cd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
10ce0 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
10cf0 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
10d00 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10d10 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
10d20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
10d30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10d40 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
10d50 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
10d60 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
10d70 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
10d80 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
10d90 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
10da0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10db0 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
10dc0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
10dd0 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
10de0 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
10df0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
10e00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
10e10 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
10e20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
10e30 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
10e40 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
10e50 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
10e60 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
10e70 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
10e80 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
10e90 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
10ea0 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
10eb0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
10ec0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
10ed0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
10ee0 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
10ef0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
10f00 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
10f10 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
10f20 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
10f30 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
10f40 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
10f50 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
10f60 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
10f70 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
10f80 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
10f90 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
10fa0 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
10fb0 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
10fc0 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
10fd0 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
10fe0 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
10ff0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
11000 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
11010 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11020 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
11030 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
11040 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
11050 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
11060 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
11070 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
11080 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
11090 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
110a0 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
110b0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
110c0 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
110d0 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
110e0 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
110f0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
11100 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
11110 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
11120 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
11130 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
11140 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
11150 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
11160 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
11170 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11180 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
111a0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
111b0 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
111c0 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49  SQLITE_UTF8,SQLI
111d0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
111e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
111f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11200 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65       db->errCode
11210 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20   = p->rc;.      
11220 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11230 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11240 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
11250 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
11260 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
11270 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11280 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
11290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
112a0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
112b0 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
112c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
112d0 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
112e0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
112f0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
11300 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
11310 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
11320 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
11330 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
11340 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
11350 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
11360 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
11370 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
11380 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
11390 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
113a0 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
113b0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
113c0 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
113d0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
113e0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
113f0 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
11400 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
11410 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
11420 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
11430 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
11440 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
11450 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11460 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11470 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
11480 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
11490 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
114a0 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
114b0 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
114c0 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
114d0 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
114e0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
114f0 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
11500 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
11510 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
11520 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
11530 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
11540 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
11550 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
11560 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
11570 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
11580 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11590 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
115a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
115b0 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
115c0 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
115d0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
115e0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
115f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11600 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
11610 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
11620 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
11630 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
11640 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
11650 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
11660 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
11670 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
11680 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
11690 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
116a0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
116b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
116c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
116d0 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
116e0 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
116f0 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
11700 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
11710 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
11720 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
11730 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
11740 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
11750 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
11760 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
11770 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
11780 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
11790 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
117a0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
117b0 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
117c0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
117d0 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
117e0 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
117f0 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
11800 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
11810 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11820 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
11830 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
11840 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
11850 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
11860 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11870 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
11880 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
11890 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
118a0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
118b0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
118c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
118d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
118e0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
118f0 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
11900 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
11910 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
11920 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11930 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
11940 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
11950 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
11960 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
11970 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
11980 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
11990 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
119a0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
119b0 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
119c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
119d0 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
119e0 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
119f0 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
11a00 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
11a10 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
11a20 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
11a30 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
11a40 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
11a50 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
11a60 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
11a70 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c  (mask&(((u32)1)<
11a80 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
11a90 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
11aa0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
11ab0 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
11ac0 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
11ad0 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
11ae0 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
11af0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
11b00 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
11b10 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
11b20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
11b30 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
11b40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
11b50 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
11b60 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
11b70 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
11b80 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
11b90 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
11ba0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
11bb0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
11bc0 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
11bd0 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
11be0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
11bf0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
11c00 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
11c10 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
11c20 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
11c30 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
11c40 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
11c50 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
11c60 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
11c70 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
11c80 4e 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70  N);.  vdbeFreeOp
11c90 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
11ca0 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
11cb0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11cc0 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
11cd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11ce0 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
11cf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11d00 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e   p->zSql);.  p->
11d10 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
11d20 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74  IC_DEAD;.  sqlit
11d30 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
11d40 70 46 72 65 65 29 3b 0a 20 20 70 2d 3e 64 62 20  pFree);.  p->db 
11d50 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
11d60 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
11d70 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
11d80 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
11d90 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
11da0 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
11db0 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
11dc0 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
11dd0 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
11de0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
11df0 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
11e00 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
11e10 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
11e20 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
11e30 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
11e40 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
11e50 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
11e60 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
11e70 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
11e80 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
11e90 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
11ea0 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
11eb0 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
11ec0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
11ed0 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
11ee0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
11ef0 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
11f00 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
11f10 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
11f20 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
11f30 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
11f40 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
11f50 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
11f60 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
11f70 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
11f80 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
11f90 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
11fa0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
11fb0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11fc0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
11fd0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
11fe0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
11ff0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
12000 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
12010 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
12020 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
12030 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
12040 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
12050 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
12060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12070 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
12080 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
12090 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
120a0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
120b0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
120c0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
120d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
120e0 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
120f0 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
12100 67 65 74 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  get;.    p->rowi
12110 64 49 73 56 61 6c 69 64 20 3d 20 41 4c 57 41 59  dIsValid = ALWAY
12120 53 28 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b 0a  S(res==0) ?1:0;.
12130 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72 65      if( NEVER(re
12140 73 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63  s<0) ){.      rc
12150 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
12160 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
12170 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
12180 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12190 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
121a0 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
121b0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
121c0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
121d0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
121e0 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63  to = 0;.    p->c
121f0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
12200 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73  HE_STALE;.  }els
12210 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e  e if( ALWAYS(p->
12220 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
12230 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20  int hasMoved;.  
12240 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
12250 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
12260 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
12270 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20  , &hasMoved);.  
12280 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12290 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61  n rc;.    if( ha
122a0 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20  sMoved ){.      
122b0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
122c0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
122d0 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d      p->nullRow =
122e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
122f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
12310 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
12320 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
12330 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
12340 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
12350 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
12360 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
12370 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
12380 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
12390 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
123a0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
123b0 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
123c0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
123d0 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
123e0 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
123f0 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
12400 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
12410 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
12420 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
12430 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
12440 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
12450 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
12460 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
12470 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
12480 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
12490 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
124a0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
124b0 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
124c0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
124d0 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
124e0 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
124f0 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
12500 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
12510 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
12520 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
12530 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
12540 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
12550 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
12560 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
12570 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
12580 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
12590 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
125a0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
125b0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
125c0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
125d0 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65  d data blob sepe
125e0 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
125f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
12600 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
12610 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
12620 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
12630 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
12640 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
12650 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
12660 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
12670 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
12680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
12690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
126a0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
126c0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
126d0 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
126f0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
12700 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
12710 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
12720 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
12730 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
12740 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
12770 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
12780 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
12790 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
127a0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
127b0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
127c0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
127d0 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
127e0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
127f0 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
12820 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
12830 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
12840 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
12850 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
12860 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12880 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
12890 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
128a0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
128c0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
128d0 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
128e0 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
12910 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
12920 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
12930 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
12940 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
12950 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
12960 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
12970 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
12980 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
12990 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
129a0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
129b0 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
129c0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
129d0 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
129e0 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
129f0 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
12a00 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
12a10 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
12a20 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
12a30 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
12a40 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
12a50 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
12a60 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
12a70 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
12a80 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
12a90 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
12aa0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
12ab0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
12ac0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
12ad0 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
12ae0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
12af0 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
12b00 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
12b10 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
12b20 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
12b30 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
12b40 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
12b50 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
12b60 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
12b70 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
12b80 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
12b90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
12ba0 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d   8+(u32)i;.    }
12bb0 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d  .    u = i<0 ? -
12bc0 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75  i : i;.    if( u
12bd0 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
12be0 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
12bf0 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
12c00 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
12c10 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
12c20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
12c30 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
12c40 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
12c50 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
12c60 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
12c70 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
12c80 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
12c90 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
12ca0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
12cb0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
12cc0 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
12cd0 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
12ce0 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
12cf0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
12d00 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
12d10 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
12d20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
12d30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
12d40 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
12d50 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
12d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
12d70 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
12d80 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
12d90 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
12da0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
12db0 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
12dc0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
12dd0 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
12de0 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
12df0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
12e00 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
12e10 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
12e20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
12e30 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
12e40 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
12e50 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
12e60 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
12e70 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
12e80 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
12e90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
12ea0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
12eb0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
12ec0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
12ed0 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
12ee0 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
12ef0 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
12f00 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
12f10 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
12f20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
12f30 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
12f40 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
12f50 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
12f60 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
12f70 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
12f80 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
12f90 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
12fa0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
12fb0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
12fc0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
12fd0 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
12fe0 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
12ff0 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
13000 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
13010 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
13020 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
13030 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
13040 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
13050 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
13060 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
13070 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
13080 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
13090 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
130a0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
130b0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
130c0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
130d0 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
130e0 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
130f0 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
13100 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
13110 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
13120 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
13130 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
13140 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
13150 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
13160 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
13170 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
13180 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
13190 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
131a0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
131b0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
131c0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
131d0 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
131e0 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
131f0 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
13200 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
13210 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
13220 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
13230 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
13240 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
13250 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
13260 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
13270 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
13280 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
13290 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
132a0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
132b0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
132c0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
132d0 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
132e0 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
132f0 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
13300 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
13310 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
13320 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
13330 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
13340 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
13350 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
13360 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
13370 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
13380 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
13390 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
133a0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
133b0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
133c0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
133d0 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
133e0 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
133f0 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
13400 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
13410 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
13420 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
13430 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
13440 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
13450 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
13460 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
13470 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
13480 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
13490 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
134a0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
134b0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
134c0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
134d0 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
134e0 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
134f0 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
13500 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
13510 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
13520 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
13530 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
13540 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
13550 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
13560 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
13570 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
13580 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
13590 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
135a0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
135b0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
135c0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
135d0 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
135e0 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
135f0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
13600 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
13610 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
13620 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
13630 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
13640 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
13650 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
13660 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
13670 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
13680 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
13690 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
136a0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
136b0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
136c0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
136d0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
136e0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
136f0 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
13700 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
13710 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
13720 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20  in buf[].  nBuf 
13730 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a  must always be.*
13740 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
13750 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
13760 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74  e field.  Except
13770 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69  , if the field i
13780 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68  s.** a blob with
13790 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74   a zero-filled t
137a0 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20  ail, then buf[] 
137b0 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68  might be just th
137c0 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20  e right.** size 
137d0 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69  to hold everythi
137e0 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ng except for th
137f0 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
13800 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a  il.  If buf[].**
13810 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f   is only big eno
13820 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
13830 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c  non-zero prefix,
13840 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
13850 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20   that.** prefix 
13860 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74  into buf[].  But
13870 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72   if buf[] is lar
13880 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
13890 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72  d both the.** pr
138a0 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69  efix and the tai
138b0 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  l then write the
138c0 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20   prefix and set 
138d0 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a  the tail to all.
138e0 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20  ** zeros..**.** 
138f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
13900 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
13910 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
13920 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
13930 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
13940 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
13950 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
13960 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
13970 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
13980 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
13990 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
139a0 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
139b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
139c0 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e  t(u8 *buf, int n
139d0 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Buf, Mem *pMem, 
139e0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
139f0 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  {.  u32 serial_t
13a00 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
13a10 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d  eSerialType(pMem
13a20 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
13a30 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
13a40 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
13a50 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
13a60 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
13a70 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
13a80 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
13a90 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
13aa0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
13ab0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13ac0 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
13ad0 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
13ae0 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
13af0 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
13b00 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
13b10 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
13b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13b30 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
13b40 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
13b50 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
13b60 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
13b70 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
13b80 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32  ssert( len<=(u32
13b90 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  )nBuf );.    whi
13ba0 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
13bb0 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76   buf[i] = (u8)(v
13bc0 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
13bd0 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
13be0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
13bf0 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
13c00 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
13c10 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
13c20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
13c30 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
13c40 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
13c50 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
13c60 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
13c70 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
13c80 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
13c90 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
13ca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
13cb0 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
13cc0 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
13cd0 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
13ce0 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
13cf0 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
13d00 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
13d10 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
13d20 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
13d30 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
13d40 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
13d50 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66   len > (u32)nBuf
13d60 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
13d70 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20  = (u32)nBuf;.   
13d80 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
13d90 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
13da0 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
13db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
13dc0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
13dd0 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
13de0 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
13df0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
13e00 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
13e10 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
13e20 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
13e30 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
13e40 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
13e50 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
13e60 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
13e70 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
13e80 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
13e90 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
13ea0 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
13eb0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
13ec0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
13ed0 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
13ee0 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
13ef0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
13f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13f10 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
13f20 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
13f30 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f50 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
13f60 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
13f70 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
13f80 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
13f90 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
13fa0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
13fb0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
13fc0 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
13fd0 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
13fe0 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
13ff0 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
14000 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
14010 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
14020 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14030 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
14040 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
14050 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
14060 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
14070 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
14080 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
14090 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
140a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
140b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
140c0 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
140d0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
140e0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
140f0 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
14100 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
14110 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
14120 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
14130 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
14140 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
14150 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
14160 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
14170 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
14180 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
14190 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
141a0 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
141b0 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
141c0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
141d0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
141e0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
141f0 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
14200 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
14210 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
14220 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
14230 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
14240 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
14250 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
14260 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
14270 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
14280 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
14290 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
142a0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
142b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
142c0 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
142d0 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
142e0 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
142f0 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
14300 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
14310 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
14320 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
14330 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
14340 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
14350 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
14360 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
14370 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
14380 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
14390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
143a0 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
143b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
143c0 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
143d0 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
143e0 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
143f0 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
14400 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
14410 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
14420 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14430 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
14440 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
14450 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
14460 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
14470 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
14480 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
14490 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
144a0 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
144b0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
144c0 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
144d0 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
144e0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
144f0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
14500 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
14510 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
14520 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14530 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
14540 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
14550 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
14560 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
14570 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
14580 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
14590 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
145a0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
145b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
145c0 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
145d0 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
145e0 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
145f0 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
14600 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
14610 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
14620 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
14630 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
14640 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
14650 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
14660 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
14670 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
14680 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
14690 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
146a0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
146b0 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
146c0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
146d0 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
146e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
146f0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14700 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14710 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
14720 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
14730 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
14740 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14750 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
14760 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
14770 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
14780 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
14790 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
147a0 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45  aN(pMem->r) ? ME
147b0 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
147c0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
147d0 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
147e0 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
147f0 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
14800 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
14810 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
14820 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
14830 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
14840 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14850 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14860 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
14870 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
14880 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  {.      u32 len 
14890 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
148a0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
148b0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
148c0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
148d0 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
148e0 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
148f0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
14900 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
14910 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14920 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
14930 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
14940 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
14950 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
14960 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
14970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
14980 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
14990 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
149a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  }.../*.** Given 
149b0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
149c0 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
149d0 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61  rd in pKey[], pa
149e0 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  rse the.** recor
149f0 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65  d into a Unpacke
14a00 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
14a10 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
14a20 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
14a30 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
14a40 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
14a50 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76  ction might prov
14a60 69 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65  ide szSpace byte
14a70 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  s of memory.** s
14a80 70 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20  pace at pSpace. 
14a90 20 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20   This space can 
14aa0 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  be used to hold 
14ab0 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
14ac0 56 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64  VDbeParsedRecord
14ad0 20 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74   structure if it
14ae0 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
14af0 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e  .  If it is.** n
14b00 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73  ot big enough, s
14b10 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64  pace is obtained
14b20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
14b30 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lloc()..**.** Th
14b40 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63  e returned struc
14b50 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63  ture should be c
14b60 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20  losed by a call 
14b70 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  to.** sqlite3Vdb
14b80 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
14b90 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70  ecord()..*/ .Unp
14ba0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
14bb0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
14bc0 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
14bd0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
14be0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
14bf0 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
14c00 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
14c10 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
14c20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
14c30 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
14c40 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
14c50 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
14c60 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
14c70 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
14c80 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  e,          /* U
14c90 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
14ca0 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64  vailable to hold
14cb0 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
14cc0 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20   int szSpace    
14cd0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
14ce0 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
14cf0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ytes */.){.  con
14d00 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14d10 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
14d20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14d30 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  pKey;.  Unpacked
14d40 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54  Record *p;  /* T
14d50 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
14d60 72 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  rd that we will 
14d70 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
14d80 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
14d90 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
14da0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70  needed to hold p
14db0 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  , in bytes */.  
14dc0 69 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78  int d;.  u32 idx
14dd0 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  ;.  u16 u;      
14de0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
14df0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
14e00 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
14e10 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
14e20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
14e30 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
14e40 70 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d  pSpace by this m
14e50 75 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c  uch to 8-byte al
14e60 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f  ign it */.  .  /
14e70 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74  *.  ** We want t
14e80 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e  o shift the poin
14e90 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75  ter pSpace up su
14ea0 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d  ch that it is 8-
14eb0 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20  byte aligned..  
14ec0 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64  ** Thus, we need
14ed0 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20   to calculate a 
14ee0 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74  value, nOff, bet
14ef0 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f  ween 0 and 7, to
14f00 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20   shift .  ** it 
14f10 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69  by.  If pSpace i
14f20 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65  s already 8-byte
14f30 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73   aligned, nOff s
14f40 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20  hould be zero.. 
14f50 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20   */.  nOff = (8 
14f60 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  - (SQLITE_PTR_TO
14f70 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37  _INT(pSpace) & 7
14f80 29 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65  )) & 7;.  pSpace
14f90 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70   += nOff;.  szSp
14fa0 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e  ace -= nOff;.  n
14fb0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
14fc0 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
14fd0 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
14fe0 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
14ff0 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20  Field+1);.  if( 
15000 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b  nByte>szSpace ){
15010 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
15020 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
15030 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
15040 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
15050 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
15060 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
15070 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55  ED_NEED_FREE | U
15080 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
15090 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TROY;.  }else{. 
150a0 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
150b0 52 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a  Record*)pSpace;.
150c0 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
150d0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
150e0 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  TROY;.  }.  p->p
150f0 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
15100 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
15110 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
15120 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65  ld + 1;.  p->aMe
15130 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a  m = pMem = (Mem*
15140 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
15150 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
15160 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
15170 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
15180 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
15190 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
151a0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
151b0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
151c0 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
151d0 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
151e0 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
151f0 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
15200 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
15210 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
15220 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
15230 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
15240 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
15250 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
15260 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
15270 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
15280 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
15290 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
152a0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
152b0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
152c0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
152d0 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
152e0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
152f0 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20  m++;.    u++;.  
15300 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
15310 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
15320 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
15330 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e  ld = u;.  return
15340 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a   (void*)p;.}../*
15350 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15360 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61   destroys a Unpa
15370 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63  ckedRecord objec
15380 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
15390 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
153a0 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63  ckedRecord(Unpac
153b0 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
153c0 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70   int i;.  Mem *p
153d0 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
153e0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
153f0 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ( p->flags & UNP
15400 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
15410 4f 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  OY );.  for(i=0,
15420 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69   pMem=p->aMem; i
15430 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c  <p->nField; i++,
15440 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pMem++){.    /*
15450 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   The unpacked re
15460 63 6f 72 64 20 69 73 20 61 6c 77 61 79 73 20 63  cord is always c
15470 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
15480 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
15490 56 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64  VdbeUnpackRecord
154a0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  () function abov
154b0 65 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61  e, which makes a
154c0 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ll.    ** string
154d0 73 20 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74  s and blobs stat
154e0 69 63 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  ic.  And none of
154f0 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72   the elements ar
15500 65 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72  e.    ** ever tr
15510 61 6e 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68  ansformed, so th
15520 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
15530 74 68 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e  thing to delete.
15540 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15550 4e 45 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c  NEVER(pMem->zMal
15560 6c 6f 63 29 20 29 20 73 71 6c 69 74 65 33 56 64  loc) ) sqlite3Vd
15570 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
15580 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  m);.  }.  if( p-
15590 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
155a0 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20  D_NEED_FREE ){. 
155b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
155c0 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  (p->pKeyInfo->db
155d0 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
155e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
155f0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
15600 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
15610 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
15620 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
15630 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
15640 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
15650 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
15660 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
15670 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
15680 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
15690 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
156a0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
156b0 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
156c0 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
156d0 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
156e0 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50  created by th OP
156f0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
15700 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
15710 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
15720 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
15730 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
15740 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
15750 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
15760 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b  eRecord..**.** K
15770 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
15780 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
15790 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
157a0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a  ber of fields..*
157b0 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66  * The key with f
157c0 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75  ewer fields is u
157d0 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20  sually compares 
157e0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a  less than the .*
157f0 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48  * longer key.  H
15800 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e  owever if the UN
15810 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66  PACKED_INCRKEY f
15820 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69  lags in pPKey2 i
15830 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65  s set.** and the
15840 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
15850 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
15860 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
15870 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69  an key2..** Or i
15880 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d  f the UNPACKED_M
15890 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67  ATCH_PREFIX flag
158a0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
158b0 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20  prefixes are.** 
158c0 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20  equal, then the 
158d0 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65  keys are conside
158e0 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20  red to be equal 
158f0 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73  and.** the parts
15900 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d   beyond the comm
15910 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67  on prefix are ig
15920 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
15930 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  the UNPACKED_IGN
15940 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69  ORE_ROWID flag i
15950 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
15960 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20  last byte of.** 
15970 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b  the header of pK
15980 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ey1 is ignored. 
15990 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
159a0 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20  hat pKey1 is.** 
159b0 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e  an index key, an
159c0 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74 68  d thus ends with
159d0 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20   a rowid value. 
159e0 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a   The last byte.*
159f0 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  * of the header 
15a00 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62  will therefore b
15a10 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  e the serial typ
15a20 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a  e of the rowid:.
15a30 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20  ** one of 1, 2, 
15a40 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f  3, 4, 5, 6, 8, o
15a50 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65  r 9 - the intege
15a60 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  r serial types..
15a70 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  ** The serial ty
15a80 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20  pe of the final 
15a90 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79  rowid will alway
15aa0 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79  s be a single by
15ab0 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69  te..** By ignori
15ac0 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79 74  ng this last byt
15ad0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c  e of the header,
15ae0 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f   we force the co
15af0 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69  mparison.** to i
15b00 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20  gnore the rowid 
15b10 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65  at the end of ke
15b20 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y1..*/.int sqlit
15b30 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
15b40 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
15b50 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
15b60 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
15b70 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
15b80 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
15b90 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
15ba0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b   */.){.  int d1;
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15bc0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
15bd0 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
15be0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
15bf0 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f  idx1;          /
15c00 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
15c10 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
15c20 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
15c30 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
15c40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15c50 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
15c60 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
15c70 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
15c80 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
15c90 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
15ca0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
15cb0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15cc0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
15cd0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
15ce0 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
15cf0 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
15d00 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d  >pKeyInfo;.  mem
15d10 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
15d20 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
15d30 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
15d40 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
15d50 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
15d60 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
15d70 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15d80 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
15d90 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c  _ONLY( mem1.zMal
15da0 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
15db0 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
15dc0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
15dd0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
15de0 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
15df0 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
15e00 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
15e10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
15e20 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
15e30 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
15e40 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
15e50 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
15e60 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
15e70 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
15e80 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
15e90 61 6c 6c 79 20 62 65 20 75 73 65 64 20 69 6e 69  ally be used ini
15ea0 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
15eb0 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
15ec0 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
15ed0 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
15ee0 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
15ef0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
15f00 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
15f10 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
15f20 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
15f30 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
15f40 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
15f50 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
15f60 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
15f70 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
15f80 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
15f90 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
15fa0 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
15fb0 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
15fc0 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
15fd0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
15fe0 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
15ff0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
16000 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
16010 20 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70   szHdr1;.  if( p
16020 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
16030 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
16040 4f 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64  OWID ){.    szHd
16050 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65  r1--;.  }.  nFie
16060 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
16070 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
16080 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
16090 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
160a0 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
160b0 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
160c0 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
160d0 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
160e0 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
160f0 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
16100 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
16110 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
16120 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
16130 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
16140 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
16150 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
16160 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
16170 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
16180 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
16190 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
161a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
161b0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
161c0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
161d0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
161e0 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
161f0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
16200 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
16210 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
16220 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
16230 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a  PKey2->aMem[i],.
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69             i<nFi
16260 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld ? pKeyInfo->
16270 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20  aColl[i] : 0);. 
16280 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
16290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
162a0 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
162b0 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
162c0 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20   below */..     
162d0 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
162e0 65 73 75 6c 74 20 69 66 20 77 65 20 61 72 65 20  esult if we are 
162f0 75 73 69 6e 67 20 44 45 53 43 20 73 6f 72 74 20  using DESC sort 
16300 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
16310 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
16320 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 6e 46  ortOrder && i<nF
16330 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f  ield && pKeyInfo
16340 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
16350 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16360 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
16370 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
16380 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20  e PREFIX_SEARCH 
16390 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
163a0 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70  all fields excep
163b0 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20  t the final.    
163c0 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64    ** rowid field
163d0 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65   were equal, the
163e0 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46  n clear the PREF
163f0 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61  IX_SEARCH flag a
16400 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a  nd set .      **
16410 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74   pPKey2->rowid t
16420 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
16430 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69  he rowid field i
16440 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29  n (pKey1, nKey1)
16450 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
16460 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f  is used by the O
16470 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64  P_IsUnique opcod
16480 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
16490 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66    if( (pPKey2->f
164a0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
164b0 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26  PREFIX_SEARCH) &
164c0 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46  & i==(pPKey2->nF
164d0 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20  ield-1) ){.     
164e0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d     assert( idx1=
164f0 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b  =szHdr1 && rc );
16500 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16510 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45   mem1.flags & ME
16520 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
16530 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
16540 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46  = ~UNPACKED_PREF
16550 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20  IX_SEARCH;.     
16560 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64     pPKey2->rowid
16570 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20   = mem1.u.i;.   
16580 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20     }.    .      
16590 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
165a0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
165b0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
165c0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
165d0 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
165e0 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
165f0 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
16600 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
16610 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
16620 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
16630 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
16640 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
16650 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
16660 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
16670 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
16680 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
16690 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
166a0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
166b0 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
166c0 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
166d0 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
166e0 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
166f0 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
16700 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
16710 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
16720 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73  KEY.  ** flag is
16730 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b   set, then break
16740 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61   the tie by trea
16750 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72  ting key2 as lar
16760 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ger..  ** If the
16770 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f   UPACKED_PREFIX_
16780 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65  MATCH flag is se
16790 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74  t, then keys wit
167a0 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  h common prefixe
167b0 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69  s.  ** are consi
167c0 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
167d0 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  l.  Otherwise, t
167e0 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73  he longer key is
167f0 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65   the .  ** large
16800 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e  r.  As it happen
16810 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69  s, the pPKey2 wi
16820 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ll always be the
16830 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20   longer.  ** if 
16840 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65  there is a diffe
16850 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  rence..  */.  as
16860 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
16870 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
16880 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs & UNPACKED_IN
16890 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20  CRKEY ){.    rc 
168a0 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = -1;.  }else if
168b0 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
168c0 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
168d0 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f  X_MATCH ){.    /
168e0 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f  * Leave rc==0 */
168f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78  .  }else if( idx
16900 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20  1<szHdr1 ){.    
16910 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  rc = 1;.  }.  re
16920 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a  turn rc;.}. ../*
16930 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
16940 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
16950 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
16960 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
16970 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
16980 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
16990 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
169a0 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
169b0 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
169c0 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
169d0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
169e0 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
169f0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
16a00 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
16a10 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
16a20 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
16a30 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
16a40 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16a50 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
16a60 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
16a70 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
16a80 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
16a90 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
16aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16ab0 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
16ac0 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
16ad0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
16ae0 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
16af0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
16b00 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
16b10 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
16b20 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
16b30 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
16b40 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
16b50 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
16b60 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
16b70 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
16b80 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
16b90 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e   Mem m, v;..  UN
16ba0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
16bb0 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  b);..  /* Get th
16bc0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
16bd0 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
16be0 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
16bf0 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
16c00 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
16c10 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
16c20 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
16c30 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
16c40 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
16c50 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
16c60 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
16c70 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
16c80 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
16c90 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
16ca0 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
16cb0 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
16cc0 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
16cd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
16ce0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
16cf0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
16d00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
16d10 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
16d20 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
16d30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16d40 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
16d50 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
16d60 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
16d70 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
16d80 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
16d90 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
16da0 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
16db0 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
16dc0 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
16dd0 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
16de0 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  entry */.  memse
16df0 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
16e00 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  m));.  rc = sqli
16e10 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
16e20 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e  ree(pCur, 0, (in
16e30 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
16e40 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
16e50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16e60 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
16e70 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
16e80 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
16e90 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
16ea0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
16eb0 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
16ec0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
16ed0 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
16ee0 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
16ef0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
16f00 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
16f10 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
16f20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
16f30 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
16f40 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
16f50 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
16f60 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
16f70 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
16f80 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
16f90 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
16fa0 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
16fb0 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
16fc0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
16fd0 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
16fe0 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
16ff0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
17000 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
17010 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17020 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
17030 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
17040 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
17050 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
17060 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
17070 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
17080 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17090 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
170a0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
170b0 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
170c0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
170d0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
170e0 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
170f0 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
17100 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
17110 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
17120 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
17130 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
17140 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17150 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
17160 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
17170 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
17180 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
17190 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
171a0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
171b0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
171c0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
171d0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
171e0 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
171f0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
17200 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
17210 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
17220 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
17230 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
17240 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
17250 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
17260 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
17270 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
17280 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
17290 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
172a0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
172b0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
172c0 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
172d0 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
172e0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
172f0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
17300 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
17310 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
17320 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17330 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
17340 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b   m.zMalloc!=0 );
17350 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
17360 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
17370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17380 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
17390 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
173a0 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
173b0 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
173c0 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
173d0 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
173e0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
173f0 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
17400 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
17410 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
17420 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
17430 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
17440 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
17450 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
17460 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
17470 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
17480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
17490 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
174a0 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
174b0 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
174c0 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
174d0 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
174e0 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
174f0 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
17500 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
17510 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
17520 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
17530 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
17540 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
17550 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
17560 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
17570 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
17580 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
17590 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
175a0 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
175b0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
175c0 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
175d0 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f  are(.  VdbeCurso
175e0 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
175f0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
17600 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
17610 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
17620 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
17630 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  ed,  /* Unpacked
17640 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
17650 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
17660 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  st */.  int *res
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17690 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
176a0 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
176b0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
176c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
176d0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
176e0 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
176f0 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
17700 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17710 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
17720 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17730 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
17740 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
17750 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
17760 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
17770 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
17780 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
17790 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
177a0 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
177b0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
177c0 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
177d0 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
177e0 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68   the say.  ** th
177f0 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
17800 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
17810 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
17820 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
17830 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
17840 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
17850 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
17860 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
17870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17880 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
17890 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
178a0 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72   sizeof(m));.  r
178b0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
178c0 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
178d0 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74  pCursor, 0, (int
178e0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
178f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
17900 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17910 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70  }.  assert( pUnp
17920 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55  acked->flags & U
17930 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
17940 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d  OWID );.  *res =
17950 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
17960 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
17970 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
17980 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
17990 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
179a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
179b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
179c0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
179d0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
179e0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
179f0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
17a00 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
17a10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17a20 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
17a30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
17a40 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
17a50 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
17a60 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
17a70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17a80 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
17a90 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
17aa0 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
17ab0 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
17ac0 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
17ad0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
17ae0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
17af0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
17b00 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
17b10 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
17b20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
17b30 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
17b40 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
17b50 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
17b60 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
17b70 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
17b80 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17b90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17ba0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
17bb0 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
17bc0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
17bd0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
17be0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
17bf0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
17c00 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
17c10 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
17c20 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
17c30 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
17c40 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
17c50 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
17c60 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
17c70 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
17c80 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
17c90 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
17ca0 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
17cb0 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
17cc0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
17cd0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
17ce0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
17cf0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17d00 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
17d10 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
17d20 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
17d30 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
17d40 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
17d50 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
17d60 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
17d70 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
17d80 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
17d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
17da0 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
17db0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
17dc0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
17dd0 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
17de0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
17df0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
17e00 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
17e10 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
17e20 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
17e30 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
17e40 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
17e50 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
17e60 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
17e70 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
17e80 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
17e90 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
17ea0 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
17eb0 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
17ec0 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
17ed0 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
17ee0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
17ef0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
17f00 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
17f10 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
17f20 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
17f30 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
17f40 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
17f50 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
17f60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
17f70 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
17f80 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
17f90 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
17fa0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
17fb0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
17fc0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
17fd0 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
17fe0 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
17ff0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
18000 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
18010 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
18020 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
18030 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
18040 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
18050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18060 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
18070 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
18080 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
18090 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
180a0 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
180b0 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73  UTF8);.        s
180c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f  qlite3VdbeMemSto
180d0 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52  reType((Mem *)pR
180e0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
180f0 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
18100 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18110 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
18120 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
18130 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
18140 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
18150 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
18160 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
18170 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
18180 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
18190 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
181a0 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
181b0 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
181c0 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
181d0 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
181e0 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
181f0 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
18200 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
18210 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
18220 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
18230 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
18240 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
18250 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
18260 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
18270 0a                                               .