/ Hex Artifact Content
Login

Artifact 9f18d228ee96b26e10f908f8f9597c700347df71:


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 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
3de0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
3df0: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
3e00: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
3e10: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
3e20: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
3e30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3e40: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
3e50: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
3e60: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
3e70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
3e80: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
3e90: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
3ea0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
3eb0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
3ec0: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
3ed0: 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20  4_MPRINTF:.     
3ee0: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
3ef0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f00: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
3f10: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
3f20: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
3f30: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
3f40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3f50: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
3f60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3f80: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
3f90: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
3fa0: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
3fb0: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a  (VdbeFunc *)p4;.
3fc0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
3fd0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
3fe0: 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  , pVdbeFunc->pFu
3ff0: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
4000: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4010: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
4020: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
4030: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
4040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4050: 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75  Free(db, pVdbeFu
4060: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
4070: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4080: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
4090: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
40a0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
40b0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
40c0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
40d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
40e0: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
40f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4100: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
4110: 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a  te3_value*)p4);.
4120: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4140: 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20  e P4_VTAB : {.  
4150: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4160: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4170: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
4180: 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b  k((VTable *)p4);
4190: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
41a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
41b0: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
41c0: 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   : {.        if(
41d0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
41e0: 64 20 29 7b 0a 09 20 20 53 75 62 50 72 6f 67 72  d ){..  SubProgr
41f0: 61 6d 20 2a 70 20 3d 20 28 53 75 62 50 72 6f 67  am *p = (SubProg
4200: 72 61 6d 20 2a 29 70 34 3b 0a 09 20 20 53 75 62  ram *)p4;..  Sub
4210: 50 72 6f 67 72 61 6d 20 2a 70 44 6f 6e 65 3b 0a  Program *pDone;.
4220: 09 20 20 66 6f 72 28 70 44 6f 6e 65 3d 64 62 2d  .  for(pDone=db-
4230: 3e 70 53 75 62 50 72 6f 67 72 61 6d 3b 20 70 44  >pSubProgram; pD
4240: 6f 6e 65 3b 20 70 44 6f 6e 65 3d 70 44 6f 6e 65  one; pDone=pDone
4250: 2d 3e 70 4e 65 78 74 29 7b 0a 09 20 20 20 20 69  ->pNext){..    i
4260: 66 28 20 70 44 6f 6e 65 3d 3d 70 20 29 20 62 72  f( pDone==p ) br
4270: 65 61 6b 3b 0a 09 20 20 7d 0a 09 20 20 69 66 28  eak;..  }..  if(
4280: 20 21 70 44 6f 6e 65 20 29 7b 0a 09 20 20 20 20   !pDone ){..    
4290: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
42a0: 53 75 62 50 72 6f 67 72 61 6d 3b 0a 09 20 20 20  SubProgram;..   
42b0: 20 64 62 2d 3e 70 53 75 62 50 72 6f 67 72 61 6d   db->pSubProgram
42c0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
42d0: 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
42e0: 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
42f0: 3e 6e 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  >nOp);.         
4300: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4310: 28 64 62 2c 20 70 29 3b 0a 09 20 20 7d 0a 09 7d  (db, p);..  }..}
4320: 65 6c 73 65 7b 0a 09 20 20 73 71 6c 69 74 65 33  else{..  sqlite3
4330: 56 64 62 65 50 72 6f 67 72 61 6d 44 65 6c 65 74  VdbeProgramDelet
4340: 65 28 64 62 2c 20 28 53 75 62 50 72 6f 67 72 61  e(db, (SubProgra
4350: 6d 20 2a 29 70 34 2c 20 31 29 3b 0a 09 7d 0a 20  m *)p4, 1);..}. 
4360: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4370: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4380: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
4390: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
43a0: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
43b0: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
43c0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
43d0: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
43e0: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
43f0: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
4400: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
4410: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
4420: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
4430: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
4440: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
4450: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
4460: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
4470: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
4480: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f  ;.    for(pOp=aO
4490: 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d  p; pOp<&aOp[nOp]
44a0: 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ; pOp++){.      
44b0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
44c0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
44d0: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
44e0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71  E_DEBUG.      sq
44f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4500: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
4510: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
4520: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
4530: 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a  bFree(db, aOp);.
4540: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
4550: 6e 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74  nt the ref-count
4560: 20 6f 6e 20 74 68 65 20 53 75 62 50 72 6f 67 72   on the SubProgr
4570: 61 6d 20 73 74 72 75 63 74 75 72 65 20 70 61 73  am structure pas
4580: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65  sed as the.** se
4590: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49  cond argument. I
45a0: 66 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20  f the ref-count 
45b0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 66 72  reaches zero, fr
45c0: 65 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ee the structure
45d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 61  ..**.** The arra
45e0: 79 20 6f 66 20 56 44 42 45 20 6f 70 63 6f 64 65  y of VDBE opcode
45f0: 73 20 73 74 6f 72 65 64 20 61 73 20 53 75 62 50  s stored as SubP
4600: 72 6f 67 72 61 6d 2e 61 4f 70 20 69 73 20 66 72  rogram.aOp is fr
4610: 65 65 64 20 69 66 0a 2a 2a 20 65 69 74 68 65 72  eed if.** either
4620: 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 72   the ref-count r
4630: 65 61 63 68 65 73 20 7a 65 72 6f 20 6f 72 20 70  eaches zero or p
4640: 61 72 61 6d 65 74 65 72 20 66 72 65 65 6f 70 20  arameter freeop 
4650: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  is non-zero..**.
4660: 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 61 72 72  ** Since the arr
4670: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 70 6f  ay of opcodes po
4680: 69 6e 74 65 64 20 74 6f 20 62 79 20 53 75 62 50  inted to by SubP
4690: 72 6f 67 72 61 6d 2e 61 4f 70 20 6d 61 79 20 64  rogram.aOp may d
46a0: 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 72 20 69 6e  irectly.** or in
46b0: 64 69 72 65 63 74 6c 79 20 63 6f 6e 74 61 69 6e  directly contain
46c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
46d0: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 73  the SubProgram s
46e0: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
46f0: 0a 2a 2a 20 42 79 20 70 61 73 73 69 6e 67 20 61  .** By passing a
4700: 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 6f 70   non-zero freeop
4710: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 20   parameter, the 
4720: 63 61 6c 6c 65 72 20 6d 61 79 20 65 6e 73 75 72  caller may ensur
4730: 65 20 74 68 61 74 20 61 6c 6c 0a 2a 2a 20 53 75  e that all.** Su
4740: 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75  bProgram structu
4750: 72 65 73 20 61 6e 64 20 74 68 65 69 72 20 61 4f  res and their aO
4760: 70 20 61 72 72 61 79 73 20 61 72 65 20 66 72 65  p arrays are fre
4770: 65 64 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68  ed, even when th
4780: 65 72 65 0a 2a 2a 20 61 72 65 20 73 75 63 68 20  ere.** are such 
4790: 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
47a0: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
47b0: 69 74 65 33 56 64 62 65 50 72 6f 67 72 61 6d 44  ite3VdbeProgramD
47c0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
47d0: 62 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  b, SubProgram *p
47e0: 2c 20 69 6e 74 20 66 72 65 65 6f 70 29 7b 0a 20  , int freeop){. 
47f0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
4800: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
4810: 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6f  );.    if( freeo
4820: 70 20 7c 7c 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  p || p->nRef==1 
4830: 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 61 4f 70  ){.      Op *aOp
4840: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = p->aOp;.     
4850: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 20   p->aOp = 0;.   
4860: 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
4870: 61 79 28 64 62 2c 20 61 4f 70 2c 20 70 2d 3e 6e  ay(db, aOp, p->n
4880: 4f 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  Op);.      p->nO
4890: 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  p = 0;.    }.   
48a0: 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20   p->nRef--;.    
48b0: 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
48c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
48d0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
48e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
48f0: 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64  * Change N opcod
4900: 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 61  es starting at a
4910: 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a  ddr to No-ops..*
4920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4930: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
4940: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4950: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
4960: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64  p->aOp ){.    Vd
4970: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
4980: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73  aOp[addr];.    s
4990: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
49a0: 64 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e  db;.    while( N
49b0: 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  -- ){.      free
49c0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
49d0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
49e0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70        memset(pOp
49f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
4a00: 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  0]));.      pOp-
4a10: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
4a20: 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a  p;.      pOp++;.
4a30: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4a40: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
4a50: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
4a60: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
4a70: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
4a80: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
4a90: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
4aa0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
4ab0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
4ac0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
4ad0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
4ae0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
4af0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
4b00: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
4b10: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
4b20: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
4b30: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
4b40: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
4b50: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
4b60: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
4b70: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
4b80: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
4b90: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4ba0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
4bb0: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
4bc0: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
4bd0: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
4be0: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
4bf0: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
4c00: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
4c10: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
4c20: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20  s of zP4..**.** 
4c30: 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  If n==P4_KEYINFO
4c40: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a   it means that z
4c50: 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
4c60: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
4c70: 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70  ucture..** A cop
4c80: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
4c90: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
4ca0: 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  re into memory o
4cb0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
4cc0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20  sqlite3_malloc, 
4cd0: 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e  to be freed when
4ce0: 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e   the Vdbe is fin
4cf0: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34  alized..** n==P4
4d00: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
4d10: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
4d20: 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  zP4 points to a 
4d30: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4d40: 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d  e.** stored in m
4d50: 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63  emory that the c
4d60: 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e  aller has obtain
4d70: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
4d80: 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20  malloc. The .** 
4d90: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f  caller should no
4da0: 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63  t free the alloc
4db0: 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ation, it will b
4dc0: 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65  e freed when the
4dd0: 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61   Vdbe is.** fina
4de0: 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74  lized..** .** Ot
4df0: 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20  her values of n 
4e00: 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43  (P4_STATIC, P4_C
4e10: 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64  OLLSEQ etc.) ind
4e20: 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70  icate that zP4 p
4e30: 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74  oints.** to a st
4e40: 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72  ring or structur
4e50: 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e  e that is guaran
4e60: 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f  teed to exist fo
4e70: 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  r the lifetime o
4e80: 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49  f.** the Vdbe. I
4e90: 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65  n these cases we
4ea0: 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74   can just copy t
4eb0: 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  he pointer..**.*
4ec0: 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e  * If addr<0 then
4ed0: 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68   change P4 on th
4ee0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
4ef0: 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63  inserted instruc
4f00: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4f10: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4f20: 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  4(Vdbe *p, int a
4f30: 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ddr, const char 
4f40: 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *zP4, int n){.  
4f50: 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74  Op *pOp;.  sqlit
4f60: 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74  e3 *db;.  assert
4f70: 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
4f80: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
4f90: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4fa0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
4fb0: 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c   if( p->aOp==0 |
4fc0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
4fd0: 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e  ed ){.    if ( n
4fe0: 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20  !=P4_KEYINFO && 
4ff0: 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20  n!=P4_VTAB ) {. 
5000: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
5010: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
5020: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a  **)&zP4);.    }.
5030: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5040: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5050: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
5060: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
5070: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
5080: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
5090: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
50a0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
50b0: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
50c0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
50d0: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
50e0: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
50f0: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
5100: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
5110: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
5120: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
5130: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
5140: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
5150: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
5160: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
5170: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
5180: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
5190: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
51a0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
51b0: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
51c0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
51d0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
51e0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
51f0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
5200: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5210: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b  KEYINFO ){.    K
5220: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
5230: 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64  ;.    int nField
5240: 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46  , nByte;..    nF
5250: 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f  ield = ((KeyInfo
5260: 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a  *)zP4)->nField;.
5270: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
5280: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20  of(*pKeyInfo) + 
5290: 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f  (nField-1)*sizeo
52a0: 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  f(pKeyInfo->aCol
52b0: 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a  l[0]) + nField;.
52c0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
52d0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42  qlite3Malloc( nB
52e0: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
52f0: 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p4.pKeyInfo = pK
5300: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  eyInfo;.    if( 
5310: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
5320: 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72    u8 *aSortOrder
5330: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28  ;.      memcpy((
5340: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
5350: 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69  zP4, nByte - nFi
5360: 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f 72  eld);.      aSor
5370: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
5380: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  o->aSortOrder;. 
5390: 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72       if( aSortOr
53a0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  der ){.        p
53b0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
53c0: 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  der = (unsigned 
53d0: 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d  char*)&pKeyInfo-
53e0: 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a  >aColl[nField];.
53f0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
5400: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5410: 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c  der, aSortOrder,
5420: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
5430: 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  }.      pOp->p4t
5440: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
5450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5460: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
5470: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5480: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5490: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
54a0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
54b0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
54c0: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
54d0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
54e0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
54f0: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
5500: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
5510: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  P4_VTAB ){.    p
5520: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5530: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5540: 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42  p4type = P4_VTAB
5550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
5560: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  bLock((VTable *)
5570: 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zP4);.    assert
5580: 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ( ((VTable *)zP4
5590: 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  )->db==p->db );.
55a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
55b0: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
55c0: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
55d0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
55e0: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
55f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
5600: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
5610: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
5620: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
5630: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
5640: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
5650: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
5660: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
5670: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5680: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
5690: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
56a0: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
56b0: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
56c0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
56d0: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
56e0: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
56f0: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
5700: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
5710: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
5720: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
5730: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
5740: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
5750: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
5760: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
5770: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
5780: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
5790: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
57a0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
57b0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
57c0: 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20 29  t ap;.  if( !p )
57d0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
57e0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
57f0: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
5800: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
5810: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
5820: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
5830: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
5840: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
5850: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
5860: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
5870: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
5880: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
5890: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
58a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
58b0: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
58c0: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
58d0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
58e0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
58f0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
5900: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
5910: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
5920: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
5930: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5940: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5950: 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  p;.  if( !p ) re
5960: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
5970: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
5980: 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28  Noop);.  assert(
5990: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
59a0: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
59b0: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
59c0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
59d0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
59e0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
59f0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5a00: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72  >nOp ){.    char
5a10: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b   **pz = &p->aOp[
5a20: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
5a30: 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  nt;.    va_start
5a40: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
5a50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5a60: 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20  (p->db, *pz);.  
5a70: 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56    *pz = sqlite3V
5a80: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5a90: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
5aa0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5ab0: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
5ac0: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EBUG */../*.** R
5ad0: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
5ae0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
5af0: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
5b00: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
5b10: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
5b20: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
5b30: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
5b40: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
5b50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
5b60: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
5b70: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
5b80: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
5b90: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
5ba0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
5bb0: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
5bc0: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
5bd0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
5be0: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
5bf0: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
5c00: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
5c10: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
5c20: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
5c30: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
5c40: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
5c50: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
5c60: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
5c70: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74   a OOM fault wit
5c80: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
5c90: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
5ca0: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
5cb0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5cc0: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
5cd0: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
5ce0: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
5cf0: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
5d00: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
5d10: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
5d20: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
5d30: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
5d40: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
5d50: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
5d60: 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65  .**.** About the
5d70: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
5d80: 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d  MIT_TRACE:  Norm
5d90: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
5da0: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
5db0: 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e  ed.** unless p->
5dc0: 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20  nOp>0.  This is 
5dd0: 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20 61  because in the a
5de0: 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45  bsense of SQLITE
5df0: 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20  _OMIT_TRACE,.** 
5e00: 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74  an OP_Trace inst
5e10: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ruction is alway
5e20: 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73 71  s inserted by sq
5e30: 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20 61  lite3VdbeGet() a
5e40: 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e  s soon as.** a n
5e50: 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61 74  ew VDBE is creat
5e60: 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66  ed.  So we are f
5e70: 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72 20  ree to set addr 
5e80: 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68  to p->nOp-1 with
5e90: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
5ea0: 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f   double-check to
5eb0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5ec0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
5ed0: 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a  n-negative. But.
5ee0: 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** if SQLITE_OMI
5ef0: 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69 6e  T_TRACE is defin
5f00: 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65  ed, the OP_Trace
5f10: 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
5f20: 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a  we do need to.**
5f30: 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   check the value
5f40: 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66   of p->nOp-1 bef
5f50: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a  ore continuing..
5f60: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
5f70: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
5f80: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
5f90: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
5fa0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
5fb0: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
5fc0: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
5fd0: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
5fe0: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
5ff0: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
6000: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
6010: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
6020: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
6030: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
6040: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
6050: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
6060: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
6070: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
6080: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6090: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
60a0: 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65 66  addr<0 ){.#ifdef
60b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
60c0: 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  CE.    if( p->nO
60d0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 56  p==0 ) return (V
60e0: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23  dbeOp*)&dummy;.#
60f0: 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20 3d  endif.    addr =
6100: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
6110: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
6120: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
6130: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
6140: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6150: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
6160: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
6170: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
6180: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
6190: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
61a0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
61b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
61c0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
61d0: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
61e0: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
61f0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
6200: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
6210: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
6220: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
6230: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
6240: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
6250: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
6260: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
6270: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
6280: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
6290: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
62a0: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
62b0: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
62c0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
62d0: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
62e0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61  zP4 = zTemp;.  a
62f0: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
6300: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
6310: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
6320: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
6330: 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73  _STATIC:.    cas
6340: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
6350: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
6360: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
6370: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
6380: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
6390: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
63a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
63b0: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
63c0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
63d0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69  ;.      i = sqli
63e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
63f0: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
6400: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
6410: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
6420: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6430: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
6440: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
6450: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
6460: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
6470: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6480: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pColl->zName);.
6490: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
64a0: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
64b0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
64c0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
64d0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,4);.           
64e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
64f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54    }.          zT
6500: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  emp[i++] = ',';.
6510: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b            if( pK
6520: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
6530: 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e  er && pKeyInfo->
6540: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
6550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65  .            zTe
6560: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
6570: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6580: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
6590: 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  mp[i], pColl->zN
65a0: 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20  ame,n+1);.      
65b0: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
65c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b      }else if( i+
65d0: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  4<nTemp-6 ){.   
65e0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
65f0: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34  Temp[i],",nil",4
6600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6610: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
6620: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
6630: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  mp[i++] = ')';. 
6640: 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20       zTemp[i] = 
6650: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
6660: 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20   i<nTemp );.    
6670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6680: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
6690: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
66a0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
66b0: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
66c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
66d0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
66e0: 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29   "collseq(%.20s)
66f0: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
6700: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6710: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6720: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
6730: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
6740: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
6750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6760: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6770: 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20  Temp, "%s(%d)", 
6780: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
6790: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
67a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
67b0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
67c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
67d0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
67e0: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a  zTemp, "%lld", *
67f0: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20  pOp->p4.pI64);. 
6800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6810: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
6820: 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T32: {.      sql
6830: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6840: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22  emp, zTemp, "%d"
6850: 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20  , pOp->p4.i);.  
6860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6870: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41  .    case P4_REA
6880: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
6890: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
68a0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
68b0: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61  ", *pOp->p4.pRea
68c0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
68d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
68e0: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
68f0: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d  Mem *pMem = pOp-
6900: 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20  >p4.pMem;.      
6910: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
6920: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
6930: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
6940: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6950: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
6960: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
6970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6980: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6990: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
69a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
69b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
69c0: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
69d0: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
69e0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
69f0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
6a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6a10: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6a20: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
6a30: 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d  Mem->r);.      }
6a40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
6a50: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
6a60: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
6a70: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28          zP4 = "(
6a80: 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a  blob)";.      }.
6a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6aa0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6ab0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
6ac0: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
6ad0: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
6ae0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
6af0: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
6b00: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b->pVtab;.      
6b10: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6b20: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6b30: 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74  vtab:%p:%p", pVt
6b40: 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ab, pVtab->pModu
6b50: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
6b60: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6b70: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
6b80: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAY: {.      sql
6b90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6ba0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74  emp, zTemp, "int
6bb0: 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62  array");.      b
6bc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6bd0: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
6be0: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
6bf0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6c00: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67  mp, zTemp, "prog
6c10: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
6c20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6c30: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
6c40: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
6c50: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
6c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
6c70: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
6c80: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6c90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6ca0: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
6cb0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
6cc0: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
6cd0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
6ce0: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
6cf0: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
6d00: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
6d10: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
6d20: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6d30: 20 68 61 73 20 74 6f 20 6b 6e 6f 77 20 69 6e 20   has to know in 
6d40: 61 64 76 61 6e 63 65 20 77 68 69 63 68 20 42 74  advance which Bt
6d50: 72 65 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 77  ree objects.** w
6d60: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 6f 20 74  ill be used so t
6d70: 68 61 74 20 69 74 20 63 61 6e 20 61 63 71 75 69  hat it can acqui
6d80: 72 65 20 6d 75 74 65 78 65 73 20 6f 6e 20 74 68  re mutexes on th
6d90: 65 6d 20 61 6c 6c 20 69 6e 20 73 6f 72 74 65 64  em all in sorted
6da0: 0a 2a 2a 20 6f 72 64 65 72 20 28 76 69 61 20 73  .** order (via s
6db0: 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41  qlite3VdbeMutexA
6dc0: 72 72 61 79 45 6e 74 65 72 28 29 2e 20 20 4d 75  rrayEnter().  Mu
6dd0: 74 65 78 65 73 20 61 72 65 20 61 63 71 75 69 72  texes are acquir
6de0: 65 64 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 28  ed.** in order (
6df0: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 69 6e 20  and released in 
6e00: 72 65 76 65 72 73 65 20 6f 72 64 65 72 29 20 74  reverse order) t
6e10: 6f 20 61 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b  o avoid deadlock
6e20: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
6e30: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
6e40: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b  Vdbe *p, int i){
6e50: 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61  .  int mask;.  a
6e60: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
6e70: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
6e80: 3c 73 69 7a 65 6f 66 28 75 33 32 29 2a 38 20 29  <sizeof(u32)*8 )
6e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
6ea0: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
6eb0: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d  eeMask)*8 );.  m
6ec0: 61 73 6b 20 3d 20 28 28 75 33 32 29 31 29 3c 3c  ask = ((u32)1)<<
6ed0: 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72  i;.  if( (p->btr
6ee0: 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  eeMask & mask)==
6ef0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65  0 ){.    p->btre
6f00: 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
6f10: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
6f20: 75 74 65 78 41 72 72 61 79 49 6e 73 65 72 74 28  utexArrayInsert(
6f30: 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64  &p->aMutex, p->d
6f40: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
6f50: 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69    }.}...#if defi
6f60: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
6f70: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
6f80: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
6f90: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
6fa0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
6fb0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
6fc0: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
6fd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6fe0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
6ff0: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
7000: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
7010: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
7020: 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69  Ptr[50];.  stati
7030: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
7040: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
7050: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
7060: 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  %-4s %.2X %s\n";
7070: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
7080: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
7090: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
70a0: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
70b0: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70  eof(zPtr));.  fp
70c0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
70d0: 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20  mat1, pc, .     
70e0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
70f0: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c  me(pOp->opcode),
7100: 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
7110: 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c  2, pOp->p3, zP4,
7120: 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66   pOp->p5,.#ifdef
7130: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
7140: 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e      pOp->zCommen
7150: 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  t ? pOp->zCommen
7160: 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20  t : "".#else.   
7170: 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29     "".#endif.  )
7180: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
7190: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
71a0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
71b0: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
71c0: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
71d0: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
71e0: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
71f0: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  N){.  if( p && N
7200: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e   ){.    Mem *pEn
7210: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  d;.    sqlite3 *
7220: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
7230: 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  u8 malloc_failed
7240: 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
7250: 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  led;.    if( db-
7260: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
7270: 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d  .      for(pEnd=
7280: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
7290: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
72a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
72b0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
72c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20    }.    }else.  
72d0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
72e0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
72f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
7300: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
7310: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7320: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7330: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7340: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
7350: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
7360: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
7370: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
7380: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
7390: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
73a0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
73b0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
73c0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
73d0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
73e0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
73f0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
7400: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7410: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7420: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7430: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7440: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7450: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7460: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7470: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7480: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7490: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
74a0: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
74b0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
74c0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
74d0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
74e0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
74f0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
7500: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7510: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7520: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7530: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7540: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7550: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7560: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7570: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7580: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7590: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
75a0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
75b0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
75c0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
75d0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
75e0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
75f0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7600: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7610: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7620: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7630: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7640: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7650: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7660: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7670: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7680: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7690: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
76a0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
76b0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
76c0: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
76d0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
76e0: 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  }.    db->malloc
76f0: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
7700: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
7710: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
7720: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
7730: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
7740: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7750: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
7760: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
7770: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
7780: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
7790: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
77a0: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
77b0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
77c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
77d0: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
77e0: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
77f0: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
7800: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
7810: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
7820: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
7830: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
7840: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
7850: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
7860: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
7870: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
7880: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
7890: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
78a0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
78b0: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
78c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
78d0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
78e0: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
78f0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
7900: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
7910: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
7920: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
7930: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
7940: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
7950: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
7960: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
7970: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
7980: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
7990: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
79a0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
79b0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
79c0: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
79d0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
79e0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
79f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
7a00: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
7a10: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
7a20: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
7a30: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
7a40: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
7a50: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
7a60: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
7a70: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
7a80: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
7a90: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
7aa0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
7ab0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
7ac0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
7ad0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
7ae0: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
7af0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
7b00: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
7b10: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
7b20: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
7b30: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
7b40: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
7b70: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
7ba0: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
7bb0: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
7bc0: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7bf0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
7c00: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
7c10: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
7c20: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7c30: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
7c40: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
7c50: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
7c80: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
7c90: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
7ca0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
7cb0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
7cc0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
7cd0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
7ce0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7d10: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
7d20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d40: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
7d50: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
7d60: 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74   = p->pResultSet
7d70: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
7d80: 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66   /* First Mem of
7d90: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
7da0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
7db0: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
7dc0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
7dd0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
7de0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
7df0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
7e00: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
7e10: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
7e20: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
7e30: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
7e40: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
7e50: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
7e60: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
7e70: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
7e80: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
7e90: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
7ea0: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
7eb0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
7ec0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
7ed0: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
7ee0: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
7ef0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
7f00: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
7f10: 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  , 8);..  if( p->
7f20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
7f30: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
7f40: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
7f50: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
7f60: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
7f70: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
7f80: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
7f90: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
7fa0: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
7fb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7fc0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
7fd0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7fe0: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
7ff0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
8000: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
8010: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
8020: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
8030: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
8040: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
8050: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
8060: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
8070: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
8080: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8090: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
80a0: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
80b0: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
80c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
80d0: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
80e0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
80f0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
8100: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
8110: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
8120: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
8130: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
8140: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
8150: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
8160: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
8170: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
8180: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
8190: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
81a0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
81b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
81c0: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
81d0: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
81e0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
81f0: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
8200: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
8210: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
8220: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
8230: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
8240: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
8250: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
8260: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
8270: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
8280: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
8290: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
82a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
82b0: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
82c0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
82d0: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
82e0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
82f0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
8300: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
8310: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
8320: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
8330: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
8340: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
8350: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
8360: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
8370: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
8380: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
8390: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
83a0: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
83b0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
83c0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
83d0: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
83e0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
83f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
8400: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
8410: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
8420: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
8430: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
8440: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
8450: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
8460: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
8470: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
8480: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
8490: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
84a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
84b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
84c0: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
84d0: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
84e0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
84f0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
8500: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
8510: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
8520: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
8530: 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
8540: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
8550: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8560: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20  char *z;.    Op 
8570: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
8580: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
8590: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
85a0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
85b0: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
85c0: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
85d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
85e0: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
85f0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
8600: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
8610: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
8620: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
8630: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
8640: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
8650: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
8660: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
8670: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
8680: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
8690: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
86a0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
86b0: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
86c0: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
86d0: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
86e0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
86f0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
8700: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
8710: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
8720: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
8730: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8740: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
8750: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
8760: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
8770: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
8780: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
87b0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  nter */.      pM
87c0: 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70  em++;.  .      p
87d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
87e0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
87f0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
8800: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
8810: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
8820: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
8830: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
8840: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
8850: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
8860: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
8870: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
8880: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
8890: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
88a0: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
88b0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
88c0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
88d0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
88e0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
88f0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
8900: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
8910: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
8920: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
8930: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
8940: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
8950: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
8960: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
8970: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
8980: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
8990: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
89a0: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
89b0: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
89c0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
89d0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
89e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
89f0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
8a00: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
8a10: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
8a20: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
8a30: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
8a40: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
8a50: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
8a60: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
8a70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8a80: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
8a90: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
8aa0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8ab0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
8ac0: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
8ad0: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
8ae0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
8af0: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
8b00: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
8b10: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
8b20: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
8b30: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
8b40: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
8b50: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
8b60: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
8b70: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
8b80: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
8b90: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
8ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8bb0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
8bc0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8bd0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
8be0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
8c10: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
8c20: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
8c30: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
8c40: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8c50: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
8c60: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
8c90: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
8ca0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
8cb0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
8cc0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
8cd0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
8ce0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8cf0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
8d00: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
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 49 4e 54 45  pe = SQLITE_INTE
8d50: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  GER;.      pMem+
8d60: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
8d70: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
8d80: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
8d90: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
8da0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
8db0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
8dc0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8dd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8de0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
8df0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8e00: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
8e10: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
8e20: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
8e30: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
8e40: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
8e50: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
8e60: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
8e70: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
8e80: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
8e90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8ea0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8eb0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8ec0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8ed0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8ee0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8ef0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8f00: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
8f10: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
8f20: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
8f30: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8f40: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
8f50: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
8f60: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
8f70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
8f80: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
8f90: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8fa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8fb0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
8fc0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8fd0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
8fe0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
8ff0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
9000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9010: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
9020: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
9030: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
9040: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
9050: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
9060: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
9070: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
9080: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
9090: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
90a0: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
90b0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
90c0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
90d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
90e0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
90f0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
9100: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
9110: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
9120: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
9130: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
9140: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
9150: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
9160: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9170: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d  TE_TEXT;.      }
9180: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
9190: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    {.        pMem
91a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
91b0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
91c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
91d0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
91e0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
91f0: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_NULL;.      
9200: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  }.    }..    p->
9210: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
9220: 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   5*(p->explain-1
9230: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  );.    p->rc = S
9240: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
9250: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
9260: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9270: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9280: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9290: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
92a0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
92b0: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
92c0: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
92d0: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
92e0: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
92f0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
9300: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
9310: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
9320: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
9330: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
9340: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
9350: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
9360: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
9370: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
9380: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  z!=0 ){.    cons
9390: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
93a0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65  >p4.z;.    while
93b0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
93c0: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
93d0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
93e0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
93f0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
9400: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9410: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
9420: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9430: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
9440: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
9450: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
9460: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
9470: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9480: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
9490: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
94a0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
94b0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
94c0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
94d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
94e0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
94f0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
9500: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
9510: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
9520: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
9530: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
9540: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
9550: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
9560: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
9570: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
9580: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
9590: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
95a0: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
95b0: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
95c0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
95d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
95e0: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
95f0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
9600: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
9610: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
9620: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9640: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
9650: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9660: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
9670: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
9680: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
9690: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
96a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
96b0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
96c0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
96d0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
96e0: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
96f0: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
9700: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
9710: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
9720: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
9730: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
9740: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
9750: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
9760: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
9770: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
9780: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
9790: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
97a0: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
97b0: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
97c0: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
97d0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
97e0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
97f0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
9800: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
9810: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
9820: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
9830: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
9840: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
9850: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
9860: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
9870: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
9880: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
9890: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
98a0: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
98b0: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
98c0: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
98d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
98e0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
98f0: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
9900: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
9910: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
9920: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
9930: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
9940: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
9950: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
9960: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
9970: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
9980: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
9990: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
99a0: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
99b0: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
99c0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
99d0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
99e0: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
99f0: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
9a00: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
9a10: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
9a20: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
9a30: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
9a40: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
9a50: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
9a60: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
9a70: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
9a80: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
9a90: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
9aa0: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
9ab0: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
9ac0: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
9ad0: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
9ae0: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
9af0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b00: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
9b10: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
9b20: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
9b30: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
9b40: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
9b50: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
9b60: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9b70: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
9b80: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
9b90: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
9ba0: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
9bb0: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
9bc0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
9bd0: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
9be0: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
9bf0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
9c00: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
9c10: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
9c20: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
9c30: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
9c40: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
9c50: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
9c60: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
9c70: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
9c80: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
9c90: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
9ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
9cb0: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
9cc0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
9cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
9ce0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
9cf0: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
9d00: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
9d10: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
9d20: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
9d30: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
9d40: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
9d50: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
9d60: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
9d70: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
9d80: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
9d90: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
9da0: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
9db0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
9dc0: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
9dd0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
9de0: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
9df0: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
9e00: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
9e10: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20  AGIC_RUN..**.** 
9e20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
9e30: 79 20 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65  y be called more
9e40: 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20   than once on a 
9e50: 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d  single virtual m
9e60: 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66  achine..** The f
9e70: 69 72 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64  irst call is mad
9e80: 65 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e  e while compilin
9e90: 67 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  g the SQL statem
9ea0: 65 6e 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a  ent. Subsequent.
9eb0: 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  ** calls are mad
9ec0: 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  e as part of the
9ed0: 20 70 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65   process of rese
9ee0: 74 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e  tting a statemen
9ef0: 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78  t to be.** re-ex
9f00: 65 63 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63  ecuted (from a c
9f10: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  all to sqlite3_r
9f20: 65 73 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61  eset()). The nVa
9f30: 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72  r, nMem, nCursor
9f40: 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61   .** and isExpla
9f50: 69 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  in parameters ar
9f60: 65 20 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f  e only passed co
9f70: 72 72 65 63 74 20 76 61 6c 75 65 73 20 74 68 65  rrect values the
9f80: 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74   first time.** t
9f90: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  he function is c
9fa0: 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71  alled. On subseq
9fb0: 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d  uent calls, from
9fc0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
9fd0: 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73  , nVar.** is pas
9fe0: 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c  sed -1 and nMem,
9ff0: 20 6e 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45   nCursor and isE
a000: 78 70 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70  xplain are all p
a010: 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76  assed zero..*/.v
a020: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
a030: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
a040: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
a050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a060: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
a070: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
a080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a090: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
a0a0: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
a0b0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
a0c0: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
a0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a0e0: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
a0f0: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
a100: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a130: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
a140: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ate */.  int nAr
a150: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
a160: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
a170: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
a180: 73 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 73  s in SubPrograms
a190: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
a1a0: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
a1b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a1c0: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
a1d0: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
a1e0: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73 53 74 6d  */.  int usesStm
a1f0: 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20  tJournal        
a200: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
a210: 65 74 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74  et Vdbe.usesStmt
a220: 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20  Journal */.){.  
a230: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
a240: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
a250: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
a260: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
a270: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
a280: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
a290: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
a2a0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
a2b0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
a2c0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
a2d0: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
a2e0: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
a2f0: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
a300: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
a310: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
a320: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
a330: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
a340: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
a350: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
a360: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
a370: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
a380: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
a390: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
a3a0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
a3b0: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
a3c0: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
a3d0: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
a3e0: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
a3f0: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
a400: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
a410: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
a420: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
a430: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a440: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
a450: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
a460: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
a470: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
a480: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
a490: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
a4a0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
a4b0: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
a4c0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
a4d0: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
a4e0: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
a4f0: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
a500: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
a510: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
a520: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
a530: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
a540: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
a550: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
a560: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
a570: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20  n arguments in. 
a580: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e  This is only don
a590: 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  e the.  ** first
a5a0: 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74   time this funct
a5b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ion is called fo
a5c0: 72 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20  r a given VDBE, 
a5d0: 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20  not when it is. 
a5e0: 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   ** being called
a5f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
a600: 73 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74  set() to reset t
a610: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a620: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
a630: 56 61 72 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Var>=0 && ALWAYS
a640: 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
a650: 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75 38 20  d==0) ){.    u8 
a660: 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a 29 26 70  *zCsr = (u8 *)&p
a670: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
a680: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
a690: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
a6a0: 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 75 38  oation */.    u8
a6b0: 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29 26   *zEnd = (u8 *)&
a6c0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c  p->aOp[p->nOpAll
a6d0: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
a6e0: 79 74 65 20 70 61 73 74 20 61 76 61 69 6c 61 62  yte past availab
a6f0: 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  le mem */.    in
a700: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
a730: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 6e  h extra memory n
a740: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 20 20 72 65  eeded */..    re
a750: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
a760: 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e   &nArg);.    p->
a770: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a780: 3d 20 28 75 38 29 75 73 65 73 53 74 6d 74 4a 6f  = (u8)usesStmtJo
a790: 75 72 6e 61 6c 3b 0a 20 20 20 20 69 66 28 20 69  urnal;.    if( i
a7a0: 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  sExplain && nMem
a7b0: 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65  <10 ){.      nMe
a7c0: 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  m = 10;.    }.  
a7d0: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
a7e0: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
a7f0: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
a800: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20  - (u8*)0)&7;.   
a810: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a820: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
a830: 73 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  sr) );..    /* M
a840: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
a850: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
a860: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
a870: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
a880: 6f 0a 20 20 20 20 2a 2a 20 70 61 73 73 65 73 2e  o.    ** passes.
a890: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
a8a0: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
a8b0: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
a8c0: 65 20 61 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  e at the .    **
a8d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
a8e0: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
a8f0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
a900: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
a910: 79 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  y.    ** require
a920: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
a930: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
a940: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
a950: 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70   second.    ** p
a960: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
a970: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
a980: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
a990: 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  on.  .    **.   
a9a0: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
a9b0: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
a9c0: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
a9d0: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
a9e0: 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  e from.    ** th
a9f0: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
aa00: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
aa10: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
aa20: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
aa30: 79 0a 20 20 20 20 2a 2a 20 72 65 64 75 63 65 20  y.    ** reduce 
aa40: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
aa50: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
aa60: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
aa70: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  t..    */.    do
aa80: 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d   {.      nByte =
aa90: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65   0;.      p->aMe
aaa0: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
aab0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
aac0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
aad0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
aae0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
aaf0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
ab00: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
ab10: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
ab20: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
ab30: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
ab40: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
ab50: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
ab60: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
ab70: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
ab80: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
ab90: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
aba0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
abb0: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
abc0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
abd0: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
abe0: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
abf0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
ac00: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
ac30: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
ac40: 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 20        if( nByte 
ac50: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 46  ){.        p->pF
ac60: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
ac70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
ac80: 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  yte);.      }.  
ac90: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
aca0: 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20  ree;.      zEnd 
acb0: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
acc0: 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74      }while( nByt
acd0: 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  e && !db->malloc
ace0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70  Failed );..    p
acf0: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36  ->nCursor = (u16
ad00: 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  )nCursor;.    if
ad10: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
ad20: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
ad30: 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 20 20  Var)nVar;.      
ad40: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
ad50: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
ad60: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
ad70: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
ad80: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
ad90: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
ada0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
adb0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70  >aMem ){.      p
adc0: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ade0: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
adf0: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
ae00: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
ae10: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
ae20: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
ae30: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
ae40: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31  */.      for(n=1
ae50: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
ae60: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
ae70: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
ae80: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
ae90: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
aea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
aeb0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
aec0: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d  E_DEBUG.  for(n=
aed0: 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  1; n<p->nMem; n+
aee0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
aef0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64  p->aMem[n].db==d
af00: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
af10: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
af20: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
af30: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
af40: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
af50: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
af60: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
af70: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
af80: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
af90: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
afa0: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
afb0: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
afc0: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
afd0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
afe0: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
aff0: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
b000: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
b010: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
b020: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b030: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
b040: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
b050: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  0;.      p->aOp[
b060: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
b070: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
b080: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
b090: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
b0a0: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
b0b0: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
b0c0: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
b0d0: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
b0e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
b0f0: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
b100: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
b110: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
b120: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
b130: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
b140: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
b150: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
b160: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
b170: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
b180: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
b190: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
b1a0: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
b1b0: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
b1c0: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
b1d0: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
b1e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
b1f0: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
b200: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
b210: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
b220: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
b230: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
b240: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
b250: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
b260: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
b270: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
b280: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
b290: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
b2a0: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e  *pModule = pCx->
b2b0: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
b2c0: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
b2d0: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
b2e0: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
b2f0: 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  r);.    p->inVta
b300: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
b310: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b320: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
b330: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
b340: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
b350: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
b360: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
b370: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
b380: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
b390: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
b3a0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
b3b0: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
b3c0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
b3d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
b3e0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
b3f0: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
b400: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
b410: 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70  ame->v;.  v->aOp
b420: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
b430: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
b440: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
b450: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
b460: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
b470: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
b480: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
b490: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
b4a0: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
b4b0: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
b4c0: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
b4d0: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
b4e0: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
b4f0: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
b500: 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
b510: 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
b520: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
b530: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
b540: 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
b550: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
b560: 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
b570: 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
b580: 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
b590: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
b5a0: 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
b5b0: 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
b5c0: 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
b5d0: 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
b5e0: 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
b5f0: 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
b600: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
b610: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
b620: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
b630: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
b640: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
b650: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
b660: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20  beFrame *pFrame 
b670: 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20  = p->pFrame;.   
b680: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
b690: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
b6a0: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
b6b0: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
b6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b6d0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
b6e0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
b6f0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
b700: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
b710: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
b720: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
b730: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
b740: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
b750: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
b760: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
b770: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
b780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b790: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
b7a0: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
b7b0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
b7c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b7d0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
b7e0: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
b7f0: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
b800: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
b810: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
b820: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
b830: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
b840: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
b850: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
b860: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
b870: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
b880: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
b890: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
b8a0: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
b8b0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
b8c0: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
b8d0: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
b8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b8f0: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
b900: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
b910: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
b920: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
b930: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
b940: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
b950: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
b960: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
b970: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
b980: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
b990: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
b9a0: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
b9b0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
b9c0: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
b9d0: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
b9e0: 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e  >apCsr==0 || p->
b9f0: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
ba00: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
ba10: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
ba20: 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c  t( p->aMem==0 ||
ba30: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
ba40: 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23  s==MEM_Null );.#
ba50: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
ba60: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
ba70: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
ba80: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
ba90: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
baa0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
bab0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
bac0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
bad0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
bae0: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
baf0: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
bb00: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
bb10: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
bb20: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
bb30: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
bb40: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
bb50: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
bb60: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
bb70: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
bb80: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
bb90: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
bba0: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
bbb0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
bbc0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
bbd0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
bbe0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
bbf0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
bc00: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
bc10: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
bc20: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
bc30: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
bc40: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
bc50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
bc60: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
bc70: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
bc80: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
bc90: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
bca0: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
bcb0: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
bcc0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
bcd0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
bce0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
bcf0: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
bd00: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
bd10: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
bd20: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
bd30: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
bd40: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
bd50: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
bd60: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
bd70: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
bd80: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
bd90: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
bda0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
bdb0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
bdc0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
bdd0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
bde0: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
bdf0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
be00: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
be10: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
be20: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
be30: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
be40: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
be50: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
be60: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
be70: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
be80: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
be90: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
bea0: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
beb0: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
bec0: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
bed0: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
bee0: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
bef0: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
bf00: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
bf10: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
bf20: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
bf30: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
bf40: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
bf70: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
bf80: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bfb0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
bfc0: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
bfd0: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c000: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
c010: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
c020: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
c030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
c040: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
c050: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
c060: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
c070: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
c080: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
c090: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
c0a0: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
c0b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
c0c0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
c0d0: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
c0e0: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
c0f0: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
c100: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
c110: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c120: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
c130: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
c140: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
c150: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
c170: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
c180: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
c190: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
c1a0: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
c1b0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
c1c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
c1d0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
c1e0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
c1f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
c200: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
c210: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
c220: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
c230: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
c240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c250: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
c260: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
c270: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
c280: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
c290: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
c2a0: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
c2b0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
c2c0: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
c2d0: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
c2e0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
c2f0: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
c300: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
c310: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
c320: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
c330: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
c340: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
c350: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
c360: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
c370: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
c380: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
c390: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
c3a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
c3b0: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
c3c0: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
c3d0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
c3e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c3f0: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
c400: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
c410: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
c420: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
c430: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
c440: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
c450: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
c460: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
c470: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
c480: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
c490: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c4a0: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
c4b0: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
c4c0: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
c4d0: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
c4e0: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
c4f0: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
c500: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
c510: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
c520: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
c530: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
c540: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
c550: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
c560: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c570: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
c580: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
c590: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
c5a0: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
c5b0: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
c5c0: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
c5d0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
c5e0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
c5f0: 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  (db, &p->zErrMsg
c600: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c610: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
c620: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
c630: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
c640: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
c650: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
c660: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
c670: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
c680: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
c690: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
c6a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
c6b0: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
c6c0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
c6d0: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
c6e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
c6f0: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
c700: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
c710: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
c720: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
c730: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
c740: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
c750: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
c760: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
c770: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
c780: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
c790: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
c7a0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
c7b0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
c7c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
c7d0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
c7e0: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
c7f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
c800: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
c810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c820: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
c830: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
c840: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
c850: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
c860: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
c870: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
c880: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
c890: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
c8a0: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
c8b0: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
c8c0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
c8d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c8e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
c8f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
c900: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
c910: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
c920: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c930: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
c940: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
c950: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
c960: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
c970: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
c980: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
c990: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
c9a0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
c9b0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
c9c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
c9d0: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
c9e0: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
c9f0: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
ca00: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
ca10: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
ca20: 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
ca30: 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
ca40: 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
ca50: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
ca60: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
ca70: 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
ca80: 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
ca90: 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
caa0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
cab0: 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
cac0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
cad0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
cae0: 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
caf0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
cb00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
cb10: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
cb20: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
cb30: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
cb40: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
cb50: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
cb60: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
cb70: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
cb80: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
cb90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
cba0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
cbb0: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
cbc0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
cbd0: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
cbe0: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
cbf0: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
cc00: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
cc10: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
cc20: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
cc30: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
cc40: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
cc50: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
cc60: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
cc70: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
cc80: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
cc90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
cca0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
ccb0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
ccc0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
ccd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
cce0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
ccf0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
cd00: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
cd10: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
cd20: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
cd30: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
cd40: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
cd50: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
cd60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cd70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cd80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
cd90: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
cda0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
cdb0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
cdc0: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
cdd0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
cde0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
cdf0: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
ce00: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
ce10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ce20: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
ce30: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
ce40: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
ce50: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  icly..  */.#ifnd
ce60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
ce70: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
ce80: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
ce90: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
cea0: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
ceb0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
cec0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
ced0: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
cee0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cef0: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
cf00: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
cf10: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
cf20: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
cf30: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
cf40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
cf50: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
cf60: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
cf70: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20    int res;..    
cf80: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
cf90: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cfa0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  name */.    do {
cfb0: 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
cfc0: 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  om;.      sqlite
cfd0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
cfe0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
cff0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
d000: 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
d010: 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
d020: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
d030: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
d040: 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e  s-mj%08X", zMain
d050: 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78  File, iRandom&0x
d060: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
d070: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
d080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d090: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d0a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
d0b0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
d0c0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
d0d0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
d0e0: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
d0f0: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
d100: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
d110: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d120: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d130: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
d140: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
d150: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d160: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
d170: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
d180: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
d190: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
d1a0: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
d1b0: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
d1c0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
d1d0: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
d1e0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
d1f0: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
d200: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
d210: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d220: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
d230: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
d240: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
d250: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
d260: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
d270: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
d280: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
d290: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
d2a0: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
d2b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d2c0: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
d2d0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
d2e0: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
d2f0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
d300: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d310: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
d320: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
d330: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
d340: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
d350: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
d360: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
d370: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
d380: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
d390: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
d3a0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
d3b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d3c0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
d3d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
d3e0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
d3f0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
d400: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
d410: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
d420: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
d430: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
d440: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
d450: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
d460: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
d470: 3d 30 20 7c 7c 20 7a 46 69 6c 65 5b 30 5d 3d 3d  =0 || zFile[0]==
d480: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
d490: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
d4a0: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
d4b0: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
d4c0: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
d4d0: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
d4e0: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
d4f0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
d500: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
d510: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
d520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d540: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
d550: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
d560: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
d570: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
d580: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
d590: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
d5a0: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
d5b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d5c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d5d0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
d5e0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
d5f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
d600: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
d610: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d620: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d630: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
d640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
d650: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d660: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
d670: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
d680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d690: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
d6a0: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
d6b0: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
d6c0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
d6d0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
d6e0: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
d6f0: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
d700: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
d710: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
d720: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
d730: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
d740: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
d750: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
d760: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
d770: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
d780: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
d790: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
d7a0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
d7b0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
d7c0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
d7d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d7e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
d7f0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
d800: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
d810: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
d820: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
d830: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
d840: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
d850: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
d860: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
d870: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
d880: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
d890: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
d8a0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
d8b0: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
d8c0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
d8d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
d8e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
d8f0: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
d900: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
d910: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
d920: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
d930: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
d940: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
d950: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
d960: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
d970: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
d980: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
d990: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
d9a0: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
d9b0: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
d9c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d9d0: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
d9e0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
d9f0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
da00: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
da10: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
da20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
da30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
da40: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
da50: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
da60: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
da70: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
da80: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
da90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
daa0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
dab0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
dac0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
dad0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
dae0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  pMaster);.    if
daf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
db00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
db10: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
db20: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
db30: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
db40: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
db50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
db60: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
db70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
db80: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
db90: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
dba0: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
dbb0: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
dbc0: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
dbd0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
dbe0: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
dbf0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
dc00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
dc10: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
dc20: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
dc30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
dc40: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
dc50: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
dc60: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
dc70: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
dc80: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
dc90: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
dca0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
dcb0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
dcc0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
dcd0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
dce0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
dcf0: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
dd00: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
dd10: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
dd20: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
dd30: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
dd40: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
dd50: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
dd60: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
dd70: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
dd80: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
dd90: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
dda0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
ddb0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
ddc0: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
ddd0: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
dde0: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
ddf0: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
de00: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
de10: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
de20: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
de30: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
de40: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
de50: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
de60: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
de70: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
de80: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
de90: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
dea0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
deb0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
dec0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ded0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
dee0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
def0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
df00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
df10: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
df20: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
df30: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
df40: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
df50: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
df60: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
df70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
df80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
df90: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
dfa0: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
dfb0: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
dfc0: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
dfd0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
dfe0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
dff0: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
e000: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
e010: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
e020: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
e030: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
e040: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
e050: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
e060: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
e070: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
e080: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
e090: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
e0a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
e0b0: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
e0c0: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
e0d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
e0e0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
e0f0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
e100: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
e110: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
e120: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
e130: 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  te = 0;.  p = db
e140: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
e150: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
e160: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
e170: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
e180: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
e190: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
e1a0: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
e1b0: 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Write++;.    }. 
e1c0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
e1d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
e1e0: 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64  nt==db->activeVd
e1f0: 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  beCnt );.  asser
e200: 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77  t( nWrite==db->w
e210: 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  riteVdbeCnt );.}
e220: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
e230: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
e240: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
e250: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
e260: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
e270: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
e280: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
e290: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
e2a0: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
e2b0: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
e2c0: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
e2d0: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
e2e0: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
e2f0: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
e300: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
e310: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
e320: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
e330: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
e340: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
e350: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
e360: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
e370: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
e380: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
e390: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
e3a0: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
e3b0: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
e3c0: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
e3d0: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
e3e0: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
e3f0: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
e400: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
e410: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
e420: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
e430: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
e440: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
e450: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
e460: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
e470: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
e480: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
e490: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
e4a0: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
e4b0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
e4c0: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
e4d0: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
e4e0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
e4f0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
e500: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
e510: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
e520: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
e530: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
e540: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
e550: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
e560: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e570: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
e580: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e590: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
e5a0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
e5b0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
e5c0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
e5d0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
e5e0: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
e5f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
e600: 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
e610: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
e620: 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
e630: 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
e640: 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
e650: 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
e660: 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
e670: 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
e680: 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
e690: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
e6a0: 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
e6b0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
e6c0: 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
e6d0: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
e6e0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
e6f0: 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
e700: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
e710: 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
e720: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
e730: 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a   is commtted..**
e740: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
e750: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
e760: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
e770: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
e780: 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
e790: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
e7a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
e7b0: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
e7c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
e7d0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
e7e0: 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
e7f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e800: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
e810: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73  p->iStatement is
e820: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
e830: 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64  ro, then this Vd
e840: 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a  be opened a .  *
e850: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
e860: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f  saction that sho
e870: 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65  uld be closed he
e880: 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63  re. The only exc
e890: 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74  eption.  ** is t
e8a0: 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hat an IO error 
e8b0: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 64  may have occured
e8c0: 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65  , causing an eme
e8d0: 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e  rgency rollback.
e8e0: 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  .  ** In this ca
e8f0: 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  se (db->nStateme
e900: 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72  nt==0), and ther
e910: 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
e920: 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  do..  */.  if( d
e930: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
e940: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
e950: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
e960: 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
e970: 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
e980: 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73  ement-1;..    as
e990: 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50  sert( eOp==SAVEP
e9a0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  OINT_ROLLBACK ||
e9b0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
e9c0: 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73  RELEASE);.    as
e9d0: 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
e9e0: 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73  ment>0 );.    as
e9f0: 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
ea00: 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
ea10: 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
ea20: 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  int) );..    for
ea30: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
ea40: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
ea50: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
ea60: 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  K;.      Btree *
ea70: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ea80: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
ea90: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pBt ){.        i
eaa0: 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
eab0: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
eac0: 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
ead0: 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
eae0: 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
eaf0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
eb00: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
eb10: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
eb20: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
eb30: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
eb40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
eb50: 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
eb60: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
eb70: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
eb80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
eb90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
eba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
ebb0: 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20   = rc2;.        
ebc0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ebd0: 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
ebe0: 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74  nt--;.    p->iSt
ebf0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
ec00: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
ec10: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
ec20: 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
ec30: 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
ec40: 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  tore the .    **
ec50: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
ec60: 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
ec70: 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
ec80: 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
ec90: 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d when .    ** t
eca0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
ecb0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
ecc0: 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ned.  */.    if(
ecd0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
ece0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
ecf0: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
ed00: 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
ed10: 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  fCons;.    }.  }
ed20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ed30: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
ed40: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
ed50: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
ed60: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
ed70: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
ed80: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
ed90: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
eda0: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
edb0: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
edc0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
edd0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
ede0: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
edf0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
ee00: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
ee10: 74 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  t.** sets the Bt
ee20: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
ee30: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
ee40: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
ee50: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
ee60: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
ee70: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
ee80: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
ee90: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
eea0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
eeb0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
eec0: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
eed0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
eee0: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
eef0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
ef00: 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20  ll() is invoked 
ef10: 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61  to set the BtSha
ef20: 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73  red.db variables
ef30: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74  .** of all of Bt
ef40: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
ef50: 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61  s accessible via
ef60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
ef70: 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61  ndle .** associa
ef80: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e  ted with the VM.
ef90: 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79 20   Of course only 
efa0: 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 73  a subset of thes
efb0: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
efc0: 77 69 6c 6c 20 62 65 20 61 63 63 65 73 73 65 64  will be accessed
efd0: 20 62 79 20 74 68 65 20 56 4d 2c 20 61 6e 64 20   by the VM, and 
efe0: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 56 64 62  we could use Vdb
eff0: 65 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f 20 66  e.btreeMask to f
f000: 69 67 75 72 65 0a 2a 2a 20 74 68 61 74 20 73 75  igure.** that su
f010: 62 73 65 74 20 6f 75 74 2c 20 62 75 74 20 74 68  bset out, but th
f020: 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74  ere is no advant
f030: 61 67 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f 2e  age to doing so.
f040: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
f050: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
f060: 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  fe and does not 
f070: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
f080: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a  ache mode, this.
f090: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
f0a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64   no-op..*/.#ifnd
f0b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f0c0: 48 41 52 45 44 5f 43 41 43 48 45 0a 76 6f 69 64  HARED_CACHE.void
f0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65   sqlite3VdbeMute
f0e0: 78 41 72 72 61 79 45 6e 74 65 72 28 56 64 62 65  xArrayEnter(Vdbe
f0f0: 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
f100: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 73 71  _THREADSAFE.  sq
f110: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
f120: 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d  rrayEnter(&p->aM
f130: 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20 73  utex);.#else.  s
f140: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
f150: 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e 64  All(p->db);.#end
f160: 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  if.}.#endif../*.
f170: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
f180: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
f190: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  a transaction op
f1a0: 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61  ened by the data
f1b0: 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  base .** handle 
f1c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f1d0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
f1e0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20   an argument is 
f1f0: 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20  about to be .** 
f200: 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68  committed. If th
f210: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
f220: 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72  ing deferred for
f230: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
f240: 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e  int.** violation
f250: 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
f260: 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73  _ERROR. Otherwis
f270: 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
f280: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
f290: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20   outstanding FK 
f2a0: 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74  violations and t
f2b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
f2c0: 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
f2d0: 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72  ERROR, set the r
f2e0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20  esult of the VM 
f2f0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  to SQLITE_CONSTR
f300: 41 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a  AINT and write.*
f310: 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  * an error messa
f320: 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
f330: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
f340: 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
f350: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
f360: 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
f370: 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
f380: 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
f390: 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
f3a0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
f3b0: 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
f3c0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
f3d0: 73 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72  s>0) || (!deferr
f3e0: 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
f3f0: 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20  traint>0) ){.   
f400: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
f410: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
f420: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
f430: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
f440: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
f450: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
f460: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   "foreign key co
f470: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
f480: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
f490: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
f4a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f4b0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
f4c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f4d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
f4e0: 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
f4f0: 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
f500: 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
f510: 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
f520: 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
f530: 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
f540: 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
f550: 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
f560: 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
f570: 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
f580: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
f590: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
f5a0: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
f5b0: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
f5c0: 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
f5d0: 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
f5e0: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
f5f0: 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
f600: 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
f610: 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
f620: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
f630: 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
f640: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
f650: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
f660: 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
f670: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
f680: 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
f690: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
f6a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
f6b0: 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
f6c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
f6d0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
f6e0: 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
f6f0: 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
f700: 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
f710: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
f720: 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
f730: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
f760: 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
f770: 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
f780: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
f790: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
f7a0: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
f7b0: 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
f7c0: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
f7d0: 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
f7e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
f7f0: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
f800: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
f810: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
f820: 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
f830: 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
f840: 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
f850: 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
f860: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
f870: 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
f880: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
f890: 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
f8a0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
f8b0: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
f8c0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
f8d0: 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
f8e0: 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
f8f0: 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
f900: 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
f910: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
f920: 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
f930: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
f940: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
f950: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
f960: 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
f970: 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
f980: 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
f990: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
f9a0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f9b0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
f9c0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
f9d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
f9e0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
f9f0: 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  EM;.  }.  closeA
fa00: 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
fa10: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
fa20: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
fa30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fa40: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
fa50: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
fa60: 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
fa70: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
fa80: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
fa90: 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
faa0: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
fab0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  pc>=0 ){.    int
fac0: 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
fad0: 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
fae0: 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
faf0: 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
fb00: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
fb10: 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
fb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
fb30: 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
fb40: 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
fb50: 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
fb60: 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
fb70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
fb80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fb90: 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28  MutexArrayEnter(
fba0: 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
fbb0: 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
fbc0: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
fbd0: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
fbe0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  rc & 0xff;.    a
fbf0: 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
fc00: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
fc10: 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65  ED );  /* This e
fc20: 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65  rror no longer e
fc30: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53  xists */.    isS
fc40: 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
fc50: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
fc60: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
fc70: 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
fc80: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
fc90: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
fca0: 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
fcb0: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
fcc0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
fcd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
fce0: 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
fcf0: 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64  -only, we need d
fd00: 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74  o no rollback at
fd10: 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c   all. Otherwise,
fd20: 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65  .      ** procee
fd30: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
fd40: 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
fd50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
fd60: 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
fd70: 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
fd80: 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
fd90: 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
fda0: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
fdb0: 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
fdc0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
fdd0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
fde0: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
fdf0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
fe00: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
fe10: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
fe20: 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
fe30: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
fe40: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
fe50: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
fe60: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
fe70: 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
fe80: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
fe90: 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
fea0: 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
feb0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
fec0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
fed0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
fee0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
fef0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
ff00: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
ff10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
ff20: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
ff30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
ff40: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
ff50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ff60: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
ff70: 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
ff80: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
ff90: 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
ffa0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
ffb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ffc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
ffd0: 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
ffe0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
fff0: 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
10000 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
10010 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
10020 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
10030 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
10040 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
10050 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
10060 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
10070 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
10080 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
10090 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
100a0 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
100b0 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
100c0 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
100d0 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
100e0 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
100f0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
10100 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
10110 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
10120 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
10130 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10140 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
10150 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
10160 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10170 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
10180 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10190 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
101a0 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
101b0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
101c0 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 20 29 7b  CheckFk(p, 1) ){
101d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
101e0 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
101f0 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65  yLeave(&p->aMute
10200 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  x);.          re
10210 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10220 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
10230 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
10240 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
10250 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70  true, the vdbe p
10260 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65  rogram was succe
10270 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 2a  ssful .        *
10280 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
10290 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
102a0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
102b0 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
102c0 67 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  gn.        ** ke
102d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
102e0 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
102f0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
10300 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
10310 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
10320 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
10330 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
10340 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
10350 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10360 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
10370 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10380 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28  MutexArrayLeave(
10390 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20  &p->aMutex);.   
103a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
103b0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
103c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
103d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
103e0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
103f0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
10400 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10410 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (db);.        }e
10420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
10430 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
10440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10450 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
10460 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
10470 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10490 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
104a0 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
104b0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
104c0 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
104d0 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
104e0 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
104f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
10500 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
10510 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10520 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
10530 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
10540 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
10550 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10560 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
10570 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
10580 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
10590 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
105a0 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
105b0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  e{.        inval
105c0 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
105d0 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
105e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
105f0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
10600 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10610 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
10620 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
10630 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
10640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10650 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
10660 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
10670 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
10680 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10690 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
106a0 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
106b0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
106c0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
106d0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
106e0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
106f0 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
10700 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
10710 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
10720 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
10730 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
10740 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
10750 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
10760 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
10770 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
10780 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
10790 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
107a0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
107b0 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  hat sqlite3VdbeC
107c0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
107d0 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66  can only fail if
107e0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20   eStatementOp.  
107f0 20 20 2a 2a 20 69 73 20 53 41 56 45 50 4f 49 4e    ** is SAVEPOIN
10800 54 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 42 75 74  T_ROLLBACK.  But
10810 20 69 66 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   if p->rc==SQLIT
10820 45 5f 4f 4b 20 74 68 65 6e 20 65 53 74 61 74 65  E_OK then eState
10830 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20 6d 75  mentOp.    ** mu
10840 73 74 20 62 65 20 53 41 56 45 50 4f 49 4e 54 5f  st be SAVEPOINT_
10850 52 45 4c 45 41 53 45 2e 20 20 48 65 6e 63 65 20  RELEASE.  Hence 
10860 74 68 65 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d  the NEVER(p->rc=
10870 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 69 6e 20 0a  =SQLITE_OK) in .
10880 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
10890 77 69 6e 67 20 63 6f 64 65 2e 0a 20 20 20 20 2a  wing code..    *
108a0 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
108b0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
108c0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
108d0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
108e0 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
108f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
10900 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10910 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 53   eStatementOp==S
10920 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10930 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  K );.        if(
10940 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51   NEVER(p->rc==SQ
10950 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72  LITE_OK) || p->r
10960 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
10970 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
10980 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
10990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
109a0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
109b0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
109c0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
109d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
109e0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
109f0 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
10a00 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
10a10 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10a20 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10a30 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
10a40 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
10a50 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
10a60 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
10a70 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
10a80 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
10a90 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
10aa0 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
10ab0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10ac0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
10ad0 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
10ae0 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
10af0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10b00 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
10b10 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
10b20 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
10b30 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
10b40 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
10b50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10b60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10b70 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
10b80 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
10b90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10bb0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
10bc0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10bd0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
10be0 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
10bf0 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63  /* Rollback or c
10c00 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61  ommit any schema
10c10 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63   changes that oc
10c20 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  curred. */.    i
10c30 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
10c40 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73  _OK && db->flags
10c50 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
10c60 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73  anges ){.      s
10c70 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
10c80 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
10c90 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
10ca0 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
10cb0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
10cc0 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  anges);.    }.. 
10cd0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
10ce0 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
10cf0 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
10d00 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
10d10 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Mutex);.  }..  /
10d20 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
10d30 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
10d40 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
10d50 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
10d60 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
10d70 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
10d80 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
10d90 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
10da0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
10db0 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10dc0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  --;.    }.    as
10dd0 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
10de0 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69  VdbeCnt>=db->wri
10df0 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d  teVdbeCnt );.  }
10e00 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
10e10 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
10e20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10e30 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
10e40 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10e50 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
10e60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
10e70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10e80 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
10e90 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
10ea0 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
10eb0 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
10ec0 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
10ed0 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
10ee0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
10ef0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
10f00 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
10f10 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
10f20 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
10f30 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
10f40 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
10f50 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
10f60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
10f70 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
10f80 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
10f90 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
10fa0 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61  beCnt>0 || db->a
10fb0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
10fc0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
10fd0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
10fe0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
10ff0 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
11000 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
11010 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
11020 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
11030 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
11040 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
11050 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
11060 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
11070 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
11080 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
11090 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
110a0 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
110b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
110c0 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
110d0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
110e0 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
110f0 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
11100 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
11110 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
11120 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
11130 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
11140 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
11150 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
11160 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
11170 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
11180 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
11190 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
111a0 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
111b0 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
111c0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
111d0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
111e0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
111f0 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
11200 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
11210 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
11220 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
11230 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
11240 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
11250 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
11260 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
11270 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
11280 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
11290 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
112a0 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
112b0 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
112c0 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
112d0 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
112e0 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
112f0 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
11300 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
11310 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
11320 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11330 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
11340 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
11350 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
11360 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
11370 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
11380 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
11390 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
113a0 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
113b0 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
113c0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
113d0 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
113e0 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
113f0 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
11400 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
11410 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
11420 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
11430 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
11440 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
11450 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
11460 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
11470 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
11480 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11490 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
114a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
114b0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
114c0 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
114d0 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49  SQLITE_UTF8,SQLI
114e0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
114f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
11500 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11510 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65       db->errCode
11520 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20   = p->rc;.      
11530 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11540 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11550 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
11560 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
11570 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
11580 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11590 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
115a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
115b0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
115c0 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
115d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
115e0 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
115f0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
11600 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
11610 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
11620 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
11630 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
11640 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
11650 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
11660 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
11670 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
11680 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
11690 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
116a0 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
116b0 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
116c0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
116d0 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
116e0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
116f0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
11700 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
11710 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
11720 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
11730 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
11740 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
11750 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
11760 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11770 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11780 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
11790 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
117a0 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
117b0 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
117c0 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
117d0 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
117e0 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
117f0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
11800 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
11810 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
11820 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
11830 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
11840 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
11850 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
11860 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
11870 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
11880 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
11890 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
118a0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
118b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
118c0 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
118d0 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
118e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
118f0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
11900 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11910 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
11920 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
11930 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
11940 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
11950 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
11960 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
11970 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
11980 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
11990 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
119a0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
119b0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
119c0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
119d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
119e0 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
119f0 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
11a00 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
11a10 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
11a20 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
11a30 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
11a40 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
11a50 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
11a60 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
11a70 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
11a80 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
11a90 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
11aa0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
11ab0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
11ac0 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
11ad0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
11ae0 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
11af0 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
11b00 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
11b10 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
11b20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11b30 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
11b40 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
11b50 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
11b60 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
11b70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11b80 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
11b90 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
11ba0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
11bb0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
11bc0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
11bd0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
11bf0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
11c00 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
11c10 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
11c20 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
11c30 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c40 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
11c50 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
11c60 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
11c70 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
11c80 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
11c90 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
11ca0 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
11cb0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
11cc0 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
11cd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
11ce0 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
11cf0 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
11d00 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
11d10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
11d20 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
11d30 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
11d40 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
11d50 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
11d60 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
11d70 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
11d80 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c  (mask&(((u32)1)<
11d90 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
11da0 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
11db0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
11dc0 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
11dd0 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
11de0 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
11df0 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
11e00 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
11e10 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
11e20 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
11e30 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
11e40 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
11e50 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
11e60 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
11e70 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
11e80 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
11e90 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
11ea0 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
11eb0 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
11ec0 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
11ed0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
11ee0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11ef0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
11f00 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
11f10 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
11f20 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 73 71 6c  DeleteObject(sql
11f30 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
11f40 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
11f50 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
11f60 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
11f70 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
11f80 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65  , p->nVar);.  re
11f90 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
11fa0 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
11fb0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
11fc0 5f 4e 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f  _N);.  vdbeFreeO
11fd0 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
11fe0 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
11ff0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12000 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
12010 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12020 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
12030 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12040 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71  , p->zSql);.  sq
12050 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12060 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 6c  p->pFree);.  sql
12070 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12080 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
12090 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
120a0 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
120b0 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
120c0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
120d0 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
120e0 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
120f0 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
12100 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
12110 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
12120 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
12130 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
12140 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
12150 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
12160 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
12170 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
12180 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
12190 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
121a0 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
121b0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
121c0 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
121d0 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
121e0 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74  VdbeDeleteObject
121f0 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
12200 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
12210 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
12220 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
12230 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
12240 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
12250 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
12260 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
12270 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
12280 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
12290 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
122a0 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
122b0 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
122c0 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
122d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
122e0 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
122f0 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
12300 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
12310 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
12320 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
12330 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
12340 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
12350 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
12360 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
12370 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
12380 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
12390 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
123a0 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
123b0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
123c0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
123d0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
123e0 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
123f0 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
12400 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
12410 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
12420 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
12430 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
12440 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
12450 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
12460 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
12470 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
12480 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
12490 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
124a0 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
124b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
124c0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
124d0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
124e0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ount;.#endif.   
124f0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61   assert( p->isTa
12500 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ble );.    rc = 
12510 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
12520 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43  toUnpacked(p->pC
12530 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
12540 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
12550 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  es);.    if( rc 
12560 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12570 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20   p->lastRowid = 
12580 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b  p->movetoTarget;
12590 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56  .    p->rowidIsV
125a0 61 6c 69 64 20 3d 20 41 4c 57 41 59 53 28 72 65  alid = ALWAYS(re
125b0 73 3d 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20  s==0) ?1:0;.    
125c0 69 66 28 20 4e 45 56 45 52 28 72 65 73 3c 30 29  if( NEVER(res<0)
125d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
125e0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
125f0 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  p->pCursor, &res
12600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
12610 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12620 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
12630 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
12640 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
12650 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e  ;.#endif.    p->
12660 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
12670 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65   0;.    p->cache
12680 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
12690 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TALE;.  }else if
126a0 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72  ( ALWAYS(p->pCur
126b0 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  sor) ){.    int 
126c0 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e  hasMoved;.    in
126d0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
126e0 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
126f0 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68  d(p->pCursor, &h
12700 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66  asMoved);.    if
12710 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12720 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76  ;.    if( hasMov
12730 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  ed ){.      p->c
12740 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
12750 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20  HE_STALE;.      
12760 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
12770 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12790 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
127a0 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
127b0 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
127c0 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
127d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
127e0 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
127f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
12800 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
12810 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
12820 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
12830 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
12840 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
12850 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
12860 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
12870 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
12880 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
12890 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
128a0 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
128b0 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
128c0 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
128d0 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
128e0 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
128f0 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
12900 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
12910 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
12920 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
12930 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
12940 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
12950 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
12960 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
12970 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
12980 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
12990 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
129a0 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
129b0 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
129c0 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
129d0 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
129e0 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
129f0 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
12a00 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
12a10 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
12a20 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
12a30 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
12a40 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
12a50 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
12a60 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65  ta blob seperate
12a70 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
12a80 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
12a90 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
12aa0 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
12ab0 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
12ac0 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
12ad0 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
12ae0 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
12af0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
12b00 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
12b10 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
12b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
12b30 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
12b40 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
12b50 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
12b60 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
12b70 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
12b80 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
12b90 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
12bc0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
12bd0 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
12bf0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
12c00 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
12c10 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
12c20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
12c30 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
12c40 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
12c70 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
12c80 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
12c90 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
12ca0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
12cb0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
12cc0 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
12cd0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
12ce0 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
12cf0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
12d00 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
12d10 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
12d20 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
12d30 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
12d40 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
12d50 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
12d60 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
12d70 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
12da0 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
12db0 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
12dc0 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
12dd0 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
12de0 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
12df0 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
12e00 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
12e10 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
12e20 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
12e30 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
12e40 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
12e50 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
12e60 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
12e70 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
12e80 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
12e90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12ea0 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
12eb0 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
12ec0 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
12ed0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
12ee0 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
12ef0 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
12f00 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  mat){.  int flag
12f10 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
12f20 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28  .  int n;..  if(
12f30 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
12f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
12f50 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
12f60 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
12f70 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
12f80 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
12f90 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
12fa0 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
12fb0 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
12fc0 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
12fd0 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
12fe0 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
12ff0 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
13000 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ( file_format>=4
13010 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a   && (i&1)==i ){.
13020 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28        return 8+(
13030 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u32)i;.    }.   
13040 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20   u = i<0 ? -i : 
13050 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32  i;.    if( u<=12
13060 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  7 ) return 1;.  
13070 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
13080 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
13090 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20  f( u<=8388607 ) 
130a0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
130b0 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
130c0 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20  ) return 4;.    
130d0 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
130e0 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20   ) return 5;.   
130f0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
13100 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
13110 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
13120 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
13130 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
13140 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
13150 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
13160 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70  Blob) );.  n = p
13170 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
13180 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
13190 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
131a0 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  >u.nZero;.  }.  
131b0 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
131c0 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
131d0 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
131e0 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
131f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13200 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
13210 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
13220 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
13230 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
13240 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
13250 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
13260 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
13270 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
13280 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
13290 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
132a0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
132b0 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
132c0 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
132d0 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
132e0 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
132f0 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
13300 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
13310 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
13320 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
13330 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
13340 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
13350 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
13360 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
13370 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
13380 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
13390 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
133a0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
133b0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
133c0 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
133d0 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
133e0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
133f0 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
13400 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
13410 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
13420 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
13430 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
13440 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
13450 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
13460 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
13470 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
13480 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
13490 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
134a0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
134b0 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
134c0 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
134d0 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
134e0 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
134f0 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
13500 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
13510 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
13520 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
13530 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
13540 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
13550 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
13560 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
13570 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
13580 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
13590 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
135a0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
135b0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
135c0 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
135d0 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
135e0 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
135f0 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
13600 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
13610 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
13620 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
13630 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
13640 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
13650 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
13660 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
13670 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
13680 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
13690 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
136a0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
136b0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
136c0 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
136d0 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
136e0 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
136f0 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
13700 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
13710 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
13720 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
13730 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
13740 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
13750 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
13760 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
13770 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
13780 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
13790 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
137a0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
137b0 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
137c0 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
137d0 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
137e0 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
137f0 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
13800 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
13810 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
13820 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
13830 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
13840 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
13850 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
13860 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
13870 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
13880 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
13890 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
138a0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
138b0 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
138c0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
138d0 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
138e0 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
138f0 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
13900 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
13910 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
13920 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
13930 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
13940 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
13950 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
13960 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
13970 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
13980 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
13990 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
139a0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
139b0 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
139c0 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
139d0 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
139e0 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
139f0 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
13a00 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
13a10 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
13a20 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
13a30 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
13a40 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
13a50 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
13a60 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
13a70 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
13a80 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
13a90 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
13aa0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13ab0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
13ac0 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
13ad0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
13ae0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
13af0 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
13b00 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
13b10 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
13b20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
13b30 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
13b40 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
13b50 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
13b60 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
13b70 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
13b80 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
13b90 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
13ba0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
13bb0 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74  uf[].  nBuf must
13bc0 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61   always be.** la
13bd0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
13be0 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
13bf0 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  eld.  Except, if
13c00 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a   the field is.**
13c10 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a   a blob with a z
13c20 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c  ero-filled tail,
13c30 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68   then buf[] migh
13c40 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69  t be just the ri
13c50 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68  ght.** size to h
13c60 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65  old everything e
13c70 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65  xcept for the ze
13c80 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20  ro-filled tail. 
13c90 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20   If buf[].** is 
13ca0 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20  only big enough 
13cb0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d  to hold the non-
13cc0 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65  zero prefix, the
13cd0 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61  n only write tha
13ce0 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f  t.** prefix into
13cf0 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20   buf[].  But if 
13d00 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65  buf[] is large e
13d10 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f  nough to hold bo
13d20 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  th the.** prefix
13d30 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68   and the tail th
13d40 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65  en write the pre
13d50 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20  fix and set the 
13d60 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a  tail to all.** z
13d70 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eros..**.** Retu
13d80 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
13d90 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
13da0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
13db0 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
13dc0 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
13dd0 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
13de0 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
13df0 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
13e00 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
13e10 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
13e20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
13e30 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
13e40 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
13e50 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c   *buf, int nBuf,
13e60 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20   Mem *pMem, int 
13e70 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
13e80 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u32 serial_type 
13e90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
13ea0 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69  ialType(pMem, fi
13eb0 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33  le_format);.  u3
13ec0 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
13ed0 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
13ee0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
13ef0 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
13f00 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
13f10 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
13f20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
13f30 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
13f40 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
13f50 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
13f60 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
13f70 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
13f80 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
13f90 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
13fa0 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
13fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
13fc0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
13fd0 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
13fe0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13ff0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
14000 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  type);.    asser
14010 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75  t( len<=(u32)nBu
14020 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
14030 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
14040 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  [i] = (u8)(v&0xF
14050 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
14060 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
14070 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
14080 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
14090 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
140a0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
140b0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
140c0 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
140d0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
140e0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
140f0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
14100 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
14110 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
14120 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
14130 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
14140 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65  <=nBuf );.    le
14150 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
14160 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
14170 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
14180 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
14190 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
141a0 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d      len += pMem-
141b0 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
141c0 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20  assert( nBuf>=0 
141d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e  );.      if( len
141e0 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a   > (u32)nBuf ){.
141f0 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75          len = (u
14200 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d  32)nBuf;.      }
14210 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62  .      memset(&b
14220 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20  uf[pMem->n], 0, 
14230 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  len-pMem->n);.  
14240 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
14250 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
14260 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
14270 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
14280 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
14290 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
142a0 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
142b0 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
142c0 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
142d0 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
142e0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
142f0 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
14300 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
14310 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32  es read..*/ .u32
14320 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14330 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
14340 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
14350 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
14360 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
14370 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
14380 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
14390 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
143a0 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
143b0 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
143c0 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
143d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
143e0 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
143f0 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
14400 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
14410 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
14420 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
14430 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
14440 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
14450 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
14460 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
14470 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
14480 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20   {  /* NULL */. 
14490 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
144a0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
144b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
144c0 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
144d0 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
144e0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
144f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67  pMem->u.i = (sig
14500 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b  ned char)buf[0];
14510 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
14520 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
14530 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14540 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
14550 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
14560 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
14570 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
14580 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
14590 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
145a0 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [1];.      pMem-
145b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
145c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
145d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
145e0 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
145f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
14600 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
14610 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
14620 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20  ar)buf[0])<<16) 
14630 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20  | (buf[1]<<8) | 
14640 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[2];.      pM
14650 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14660 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
14670 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
14680 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
14690 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
146a0 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
146b0 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c  >u.i = (buf[0]<<
146c0 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
146d0 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
146e0 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
146f0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14700 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
14710 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
14720 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
14730 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
14740 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36  eger */.      u6
14750 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20  4 x = (((signed 
14760 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
14770 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
14780 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d   u32 y = (buf[2]
14790 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c  <<24) | (buf[3]<
147a0 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c  <16) | (buf[4]<<
147b0 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20  8) | buf[5];.   
147c0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
147d0 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   y;.      pMem->
147e0 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
147f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
14800 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
14810 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
14820 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
14830 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
14840 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
14850 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
14860 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
14870 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  nt */.      u64 
14880 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a  x;.      u32 y;.
14890 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
148a0 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
148b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
148c0 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
148d0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
148e0 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
148f0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
14900 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
14910 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
14920 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
14930 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
14940 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
14950 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  OAT is.      ** 
14960 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
14970 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
14980 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
14990 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20   are mixed.     
149a0 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
149b0 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69    */.      stati
149c0 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
149d0 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
149e0 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74  0)<<32;.      st
149f0 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
14a00 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
14a10 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20    u64 t2 = t1;. 
14a20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
14a30 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
14a40 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
14a50 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
14a60 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
14a70 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
14a80 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
14a90 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66  ..      x = (buf
14aa0 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
14ab0 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
14ac0 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
14ad0 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34        y = (buf[4
14ae0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d  ]<<24) | (buf[5]
14af0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c  <<16) | (buf[6]<
14b00 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20  <8) | buf[7];.  
14b10 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
14b20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73  | y;.      if( s
14b30 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
14b40 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  .        pMem->u
14b50 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
14b60 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
14b70 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
14b80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14b90 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14ba0 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
14bb0 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29  of(pMem->r)==8 )
14bc0 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69  ;.        swapMi
14bd0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
14be0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
14bf0 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20  y(&pMem->r, &x, 
14c00 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
14c10 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14c20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
14c30 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75  Mem->r) ? MEM_Nu
14c40 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
14c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
14c60 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 8;.    }.   
14c70 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
14c80 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
14c90 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
14ca0 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
14cb0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72   pMem->u.i = ser
14cc0 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20  ial_type-8;.    
14cd0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14ce0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
14cf0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
14d00 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
14d10 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73      u32 len = (s
14d20 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
14d30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
14d40 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
14d50 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c       pMem->n = l
14d60 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  en;.      pMem->
14d70 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  xDel = 0;.      
14d80 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26  if( serial_type&
14d90 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
14da0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14db0 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65  M_Str | MEM_Ephe
14dc0 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
14dd0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
14de0 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c  ags = MEM_Blob |
14df0 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
14e00 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
14e10 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   len;.    }.  }.
14e20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
14e30 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
14e40 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
14e50 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
14e60 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20  n pKey[], parse 
14e70 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e  the.** record in
14e80 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63  to a UnpackedRec
14e90 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e 20 20  ord structure.  
14ea0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
14eb0 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75   to.** that stru
14ec0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cture..**.** The
14ed0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
14ee0 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20  n might provide 
14ef0 73 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f 66  szSpace bytes of
14f00 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65   memory.** space
14f10 20 61 74 20 70 53 70 61 63 65 2e 20 20 54 68 69   at pSpace.  Thi
14f20 73 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 75  s space can be u
14f30 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  sed to hold the 
14f40 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65  returned.** VDbe
14f50 50 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72  ParsedRecord str
14f60 75 63 74 75 72 65 20 69 66 20 69 74 20 69 73 20  ucture if it is 
14f70 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49  large enough.  I
14f80 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62  f it is.** not b
14f90 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65  ig enough, space
14fa0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
14fb0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
14fc0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ()..**.** The re
14fd0 74 75 72 6e 65 64 20 73 74 72 75 63 74 75 72 65  turned structure
14fe0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
14ff0 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a  d by a call to.*
15000 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  * sqlite3VdbeDel
15010 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
15020 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65  d()..*/ .Unpacke
15030 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
15040 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
15050 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
15060 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
15070 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
15080 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
15090 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
150b0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
150c0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
150d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
150e0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
150f0 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
15100 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20   char *pSpace,  
15110 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69          /* Unali
15120 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c  gned space avail
15130 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
15140 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
15150 20 73 7a 53 70 61 63 65 20 20 20 20 20 20 20 20   szSpace        
15160 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
15170 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
15180 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
15190 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
151a0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
151b0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
151c0 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
151d0 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20 75  rd *p;  /* The u
151e0 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74  npacked record t
151f0 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65 74 75  hat we will retu
15200 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  rn */.  int nByt
15210 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  e;          /* M
15220 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65 65 64  emory space need
15230 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69 6e  ed to hold p, in
15240 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
15250 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  d;.  u32 idx;.  
15260 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20  u16 u;          
15270 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
15280 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
15290 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
152a0 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20  em *pMem;.  int 
152b0 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  nOff;           
152c0 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53 70 61  /* Increase pSpa
152d0 63 65 20 62 79 20 74 68 69 73 20 6d 75 63 68 20  ce by this much 
152e0 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 20  to 8-byte align 
152f0 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20  it */.  .  /*.  
15300 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  ** We want to sh
15310 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
15320 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
15330 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
15340 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
15350 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
15360 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
15370 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
15380 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
15390 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
153a0 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
153b0 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
153c0 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
153d0 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
153e0 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
153f0 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
15400 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
15410 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d 20   7;.  pSpace += 
15420 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63 65 20  nOff;.  szSpace 
15430 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74 65  -= nOff;.  nByte
15440 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
15450 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
15460 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
15470 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
15480 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+1);.  if( nByt
15490 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20  e>szSpace ){.   
154a0 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
154b0 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
154c0 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
154d0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
154e0 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c  urn 0;.    p->fl
154f0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
15500 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43  EED_FREE | UNPAC
15510 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
15520 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15530 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
15540 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20  rd*)pSpace;.    
15550 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43  p->flags = UNPAC
15560 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
15570 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49  ;.  }.  p->pKeyI
15580 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
15590 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
155a0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
155b0 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   1;.  p->aMem = 
155c0 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28  pMem = (Mem*)&((
155d0 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28  char*)p)[ROUND8(
155e0 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
155f0 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65  ecord))];.  asse
15600 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
15610 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
15620 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
15630 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
15640 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
15650 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
15660 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
15670 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  u<p->nField && d
15680 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33  <=nKey ){.    u3
15690 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
156a0 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
156b0 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78  rint32(&aKey[idx
156c0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
156d0 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
156e0 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
156f0 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
15700 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
15710 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
15720 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  ;.    pMem->zMal
15730 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
15740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
15750 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
15760 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
15770 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
15780 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
15790 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
157a0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
157b0 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
157c0 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   u;.  return (vo
157d0 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  id*)p;.}../*.** 
157e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73  This routine des
157f0 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64  troys a Unpacked
15800 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a  Record object..*
15810 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
15820 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
15830 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52  Record(UnpackedR
15840 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 6e 74  ecord *p){.  int
15850 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   i;.  Mem *pMem;
15860 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
15870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
15880 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
15890 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29  D_NEED_DESTROY )
158a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65  ;.  for(i=0, pMe
158b0 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e  m=p->aMem; i<p->
158c0 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65  nField; i++, pMe
158d0 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  m++){.    /* The
158e0 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
158f0 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74   is always const
15900 72 75 63 74 65 64 20 62 79 20 74 68 65 0a 20 20  ructed by the.  
15910 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
15920 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66  UnpackRecord() f
15930 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77  unction above, w
15940 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20  hich makes all. 
15950 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e     ** strings an
15960 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20  d blobs static. 
15970 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
15980 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20   elements are.  
15990 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66    ** ever transf
159a0 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20  ormed, so there 
159b0 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e  is never anythin
159c0 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20  g to delete..   
159d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
159e0 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29  R(pMem->zMalloc)
159f0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
15a00 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
15a10 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61    }.  if( p->fla
15a20 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs & UNPACKED_NE
15a30 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73  ED_FREE ){.    s
15a40 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
15a50 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29  pKeyInfo->db, p)
15a60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
15a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
15a80 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
15a90 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
15aa0 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
15ab0 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
15ac0 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
15ad0 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
15ae0 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
15af0 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
15b00 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
15b10 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
15b20 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
15b30 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
15b40 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
15b50 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
15b60 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
15b70 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b  ted by th OP_Mak
15b80 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
15b90 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
15ba0 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
15bb0 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
15bc0 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
15bd0 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
15be0 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
15bf0 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ord..**.** Key1 
15c00 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
15c10 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
15c20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
15c30 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68  of fields..** Th
15c40 65 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72  e key with fewer
15c50 20 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c   fields is usual
15c60 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73  ly compares less
15c70 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f   than the .** lo
15c80 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76  nger key.  Howev
15c90 65 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b  er if the UNPACK
15ca0 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73  ED_INCRKEY flags
15cb0 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65   in pPKey2 is se
15cc0 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d  t.** and the com
15cd0 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65  mon prefixes are
15ce0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79   equal, then key
15cf0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b  1 is less than k
15d00 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68  ey2..** Or if th
15d10 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48  e UNPACKED_MATCH
15d20 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20  _PREFIX flag is 
15d30 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66  set and the pref
15d40 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61  ixes are.** equa
15d50 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73  l, then the keys
15d60 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
15d70 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a  to be equal and.
15d80 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79  ** the parts bey
15d90 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  ond the common p
15da0 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65  refix are ignore
15db0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
15dc0 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
15dd0 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65  ROWID flag is se
15de0 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
15df0 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20   byte of.** the 
15e00 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20  header of pKey1 
15e10 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20  is ignored.  It 
15e20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
15e30 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69  pKey1 is.** an i
15e40 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68  ndex key, and th
15e50 75 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72  us ends with a r
15e60 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65  owid value.  The
15e70 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66   last byte.** of
15e80 20 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c   the header will
15e90 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68   therefore be th
15ea0 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
15eb0 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f   the rowid:.** o
15ec0 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34  ne of 1, 2, 3, 4
15ed0 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20  , 5, 6, 8, or 9 
15ee0 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65  - the integer se
15ef0 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54  rial types..** T
15f00 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
15f10 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  f the final rowi
15f20 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  d will always be
15f30 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
15f40 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74  ** By ignoring t
15f50 68 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66  his last byte of
15f60 20 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20   the header, we 
15f70 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72  force the compar
15f80 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72  ison.** to ignor
15f90 65 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  e the rowid at t
15fa0 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a  he end of key1..
15fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15fc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
15fd0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
15fe0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
15ff0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
16000 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
16010 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
16020 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
16030 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20  ){.  int d1;    
16040 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16050 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
16060 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
16070 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
16080 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
16090 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
160a0 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
160b0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
160c0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
160d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
160e0 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
160f0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
16100 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
16110 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
16120 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16130 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
16140 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
16150 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
16160 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
16170 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
16180 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
16190 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
161a0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
161b0 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
161c0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
161d0 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
161e0 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
161f0 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
16200 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
16210 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
16220 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  Y( mem1.zMalloc 
16230 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
16240 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
16250 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
16260 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
16270 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
16280 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
16290 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
162a0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
162b0 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
162c0 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
162d0 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
162e0 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
162f0 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
16300 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
16310 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
16320 20 62 65 20 75 73 65 64 20 69 6e 69 74 69 61 6c   be used initial
16330 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
16340 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
16350 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
16360 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
16370 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
16380 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
16390 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
163a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
163b0 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
163c0 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
163d0 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
163e0 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
163f0 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
16400 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
16410 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
16420 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
16430 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
16440 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
16450 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
16460 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
16470 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
16480 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
16490 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
164a0 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79  dr1;.  if( pPKey
164b0 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
164c0 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
164d0 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d   ){.    szHdr1--
164e0 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d  ;.  }.  nField =
164f0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
16500 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
16510 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
16520 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20  ey2->nField ){. 
16530 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
16540 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
16550 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
16560 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
16570 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
16580 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
16590 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
165a0 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
165b0 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20  ial_type1 );.   
165c0 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
165d0 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
165e0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
165f0 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
16600 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  ak;..    /* Extr
16610 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
16620 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
16630 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
16640 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16650 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
16660 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
16670 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
16680 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
16690 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
166a0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
166b0 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
166c0 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20  2->aMem[i],.    
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20         i<nField 
166f0 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
16700 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
16710 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
16720 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
16730 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
16740 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
16750 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ow */..      /* 
16760 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
16770 74 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  t if we are usin
16780 67 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  g DESC sort orde
16790 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
167a0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
167b0 72 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64  rder && i<nField
167c0 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
167d0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
167e0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
167f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  .      }.    .  
16800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52      /* If the PR
16810 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67  EFIX_SEARCH flag
16820 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20   is set and all 
16830 66 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68  fields except th
16840 65 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  e final.      **
16850 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72   rowid field wer
16860 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c  e equal, then cl
16870 65 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53  ear the PREFIX_S
16880 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73  EARCH flag and s
16890 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b  et .      ** pPK
168a0 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68  ey2->rowid to th
168b0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72  e value of the r
168c0 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70  owid field in (p
168d0 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20  Key1, nKey1)..  
168e0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75      ** This is u
168f0 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73  sed by the OP_Is
16900 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20  Unique opcode.. 
16910 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16920 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  ( (pPKey2->flags
16930 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
16940 49 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d  IX_SEARCH) && i=
16950 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  =(pPKey2->nField
16960 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  -1) ){.        a
16970 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48  ssert( idx1==szH
16980 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20  dr1 && rc );.   
16990 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
169a0 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  1.flags & MEM_In
169b0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b  t );.        pPK
169c0 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55  ey2->flags &= ~U
169d0 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53  NPACKED_PREFIX_S
169e0 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70  EARCH;.        p
169f0 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d  PKey2->rowid = m
16a00 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d  em1.u.i;.      }
16a10 0a 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75  .    .      retu
16a20 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16a30 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   i++;.  }..  /* 
16a40 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
16a50 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
16a60 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
16a70 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
16a80 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
16a90 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
16aa0 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
16ab0 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
16ac0 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
16ad0 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
16ae0 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
16af0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
16b00 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
16b10 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d  ( mem1.zMalloc==
16b20 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
16b30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
16b40 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
16b50 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
16b60 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
16b70 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
16b80 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
16b90 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55   equal. If the U
16ba0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a  NPACKED_INCRKEY.
16bb0 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
16bc0 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65  , then break the
16bd0 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67   tie by treating
16be0 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e   key2 as larger.
16bf0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41  .  ** If the UPA
16c00 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
16c10 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  H flag is set, t
16c20 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f  hen keys with co
16c30 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20  mmon prefixes.  
16c40 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ** are considere
16c50 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20  d to be equal.  
16c60 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c  Otherwise, the l
16c70 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65  onger key is the
16c80 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20   .  ** larger.  
16c90 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
16ca0 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61  he pPKey2 will a
16cb0 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e  lways be the lon
16cc0 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  ger.  ** if ther
16cd0 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63  e is a differenc
16ce0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
16cf0 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ( rc==0 );.  if(
16d00 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
16d10 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
16d20 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31  Y ){.    rc = -1
16d30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
16d40 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
16d50 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
16d60 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65  TCH ){.    /* Le
16d70 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d  ave rc==0 */.  }
16d80 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a  else if( idx1<sz
16d90 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  Hdr1 ){.    rc =
16da0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
16db0 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20   rc;.}. ../*.** 
16dc0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
16dd0 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
16de0 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
16df0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
16e00 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
16e10 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
16e20 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
16e30 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
16e40 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
16e50 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
16e60 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
16e70 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
16e80 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
16e90 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
16ea0 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
16eb0 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
16ec0 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
16ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16ee0 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
16ef0 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
16f00 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
16f10 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
16f20 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
16f30 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
16f40 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
16f50 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
16f60 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
16f70 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
16f80 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
16f90 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
16fa0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
16fb0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
16fc0 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
16fd0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
16fe0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
16ff0 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
17000 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
17010 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
17020 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44   m, v;..  UNUSED
17030 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
17040 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
17050 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
17060 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
17070 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
17080 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
17090 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
170a0 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
170b0 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
170c0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
170d0 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
170e0 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
170f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
17100 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
17110 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
17120 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
17130 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
17140 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
17150 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
17160 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
17170 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
17180 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
17190 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
171a0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
171b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
171c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
171d0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
171e0 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
171f0 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
17200 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
17210 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
17220 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
17230 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
17240 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
17250 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
17260 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
17270 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d  y */.  memset(&m
17280 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
17290 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
172a0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
172b0 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43  pCur, 0, (int)nC
172c0 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
172d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
172e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
172f0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
17300 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
17310 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
17320 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
17330 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
17340 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
17350 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
17360 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17370 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
17380 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
17390 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
173a0 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
173b0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
173c0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
173d0 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
173e0 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
173f0 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
17400 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
17410 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
17420 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
17430 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
17440 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
17450 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
17460 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
17470 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
17480 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17490 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
174a0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
174b0 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
174c0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
174d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
174e0 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
174f0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17500 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
17510 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
17520 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
17530 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
17540 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
17550 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
17560 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
17570 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
17580 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
17590 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
175a0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
175b0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
175c0 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
175d0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
175e0 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
175f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
17600 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
17610 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
17620 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
17630 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
17640 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
17650 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
17660 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
17670 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
17680 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
17690 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
176a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
176b0 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
176c0 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
176d0 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
176e0 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
176f0 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
17700 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
17710 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17720 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
17730 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
17740 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
17750 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
17760 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
17770 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
17780 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
17790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
177a0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
177b0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
177c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
177d0 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
177e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
177f0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
17800 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17810 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
17820 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
17830 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
17840 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
17850 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
17860 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
17870 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
17880 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
17890 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
178a0 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
178b0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
178c0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
178d0 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
178e0 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
178f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
17900 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
17910 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
17920 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
17930 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
17940 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
17950 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
17960 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
17970 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
17980 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
17990 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
179a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
179b0 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
179c0 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
179d0 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
179e0 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
179f0 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
17a00 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
17a10 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
17a20 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
17a30 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
17a40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17a50 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
17a60 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
17a70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  C,             /
17a80 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
17a90 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
17aa0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
17ab0 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
17ac0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
17ad0 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63  sion of key to c
17ae0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
17af0 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
17b20 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
17b30 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
17b40 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
17b50 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
17b60 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
17b70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
17b80 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17b90 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
17ba0 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
17bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17bc0 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
17bd0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
17be0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
17bf0 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75  _OK );    /* pCu
17c00 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
17c10 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
17c20 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a  not fail */.  /*
17c30 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61   nCellKey will a
17c40 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e  lways be between
17c50 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66   0 and 0xfffffff
17c60 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  f because of the
17c70 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62   say.  ** that b
17c80 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
17c90 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65  () and sqlite3Ge
17ca0 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20  tVarint32() are 
17cb0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20  implemented */. 
17cc0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
17cd0 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37   || nCellKey>0x7
17ce0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a  fffffff ){.    *
17cf0 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
17d00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17d10 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d  PT_BKPT;.  }.  m
17d20 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
17d30 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20  eof(m));.  rc = 
17d40 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
17d50 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
17d60 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  sor, 0, (int)nCe
17d70 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
17d80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17d90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17da0 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65  assert( pUnpacke
17db0 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  d->flags & UNPAC
17dc0 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
17dd0 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c   );.  *res = sql
17de0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
17df0 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
17e00 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
17e10 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
17e20 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
17e30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17e40 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17e50 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
17e60 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
17e70 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
17e80 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
17e90 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
17ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
17eb0 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
17ec0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
17ed0 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
17ee0 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
17ef0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
17f00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17f10 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
17f20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
17f30 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
17f40 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
17f50 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
17f60 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
17f70 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
17f80 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
17f90 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
17fa0 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
17fb0 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
17fc0 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
17fd0 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
17fe0 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
17ff0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
18000 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
18010 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
18020 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
18030 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18040 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
18050 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
18060 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
18070 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
18080 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
18090 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
180a0 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
180b0 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
180c0 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
180d0 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
180e0 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
180f0 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
18100 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
18110 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
18120 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
18130 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
18140 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
18150 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
18160 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
18170 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
18180 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
18190 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
181a0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
181b0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
181c0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
181d0 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
181e0 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
181f0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
18200 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
18210 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
18220 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
18230 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
18240 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
18250 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
18260 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
18270 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
18280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18290 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
182a0 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
182b0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
182c0 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
182d0 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
182e0 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
182f0 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
18300 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
18310 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
18320 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
18330 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
18340 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
18350 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
18360 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
18370 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
18380 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
18390 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
183a0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
183b0 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
183c0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
183d0 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
183e0 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
183f0 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
18400 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56  e3VdbeGetValue(V
18410 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
18420 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
18430 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
18440 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
18450 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
18460 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
18470 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
18480 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
18490 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
184a0 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
184b0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
184c0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
184d0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
184e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
184f0 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
18500 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
18510 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
18520 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
18530 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
18540 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18550 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
18560 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b  pe((Mem *)pRet);
18570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
18580 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
18590 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
185a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
185b0 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
185c0 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
185d0 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
185e0 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
185f0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
18600 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
18610 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
18620 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
18630 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
18640 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
18650 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18660 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
18670 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
18680 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
18690 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
186a0 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
186b0 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
186c0 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
186d0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
186e0 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
186f0 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a           r-1));.  }.}.