/ Hex Artifact Content
Login

Artifact 64304e50c6d4ccca586410184927baa9faca6ecc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 50 61 72    if( op==OP_Par
0f60: 73 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  seSchema ){.    
0f70: 2f 2a 20 41 6e 79 20 70 72 6f 67 72 61 6d 20 74  /* Any program t
0f80: 68 61 74 20 75 73 65 73 20 74 68 65 20 4f 50 5f  hat uses the OP_
0f90: 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f  ParseSchema opco
0fa0: 64 65 20 6e 65 65 64 73 20 74 6f 20 6c 6f 63 6b  de needs to lock
0fb0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 62 74 72 65  .    ** all btre
0fc0: 65 73 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 62 74  es. */.    p->bt
0fd0: 72 65 65 4d 61 73 6b 20 3d 20 7e 28 79 44 62 4d  reeMask = ~(yDbM
0fe0: 61 73 6b 29 30 3b 0a 20 20 7d 0a 23 69 66 64 65  ask)0;.  }.#ifde
0ff0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1000: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d   pOp->zComment =
1010: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
1020: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
1030: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
1040: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
1050: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23  Op[i]);.#endif.#
1060: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
1070: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
1080: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
1090: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
10a0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
10b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
10c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
10d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
10e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
10f0: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1100: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1110: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1120: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1130: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1140: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1150: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1160: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1170: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1180: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1190: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
11a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
11c0: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
11d0: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
11e0: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
11f0: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1200: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1220: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1230: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1240: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1250: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1270: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1280: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1290: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
12a0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
12b0: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
12c0: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
12d0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
12e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12f0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1300: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1310: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1320: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1330: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
1340: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
1350: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
1360: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1380: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13a0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
13b0: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
13c0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
13d0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
13e0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
13f0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1400: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
1410: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1420: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
1430: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1440: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
1450: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
1460: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
1470: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1480: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
1490: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
14a0: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
14b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14d0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
14e0: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
14f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1500: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1510: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
1520: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1530: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
1540: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
1550: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1560: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1570: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1590: 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45  (p, addr, SQLITE
15a0: 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c  _INT_TO_PTR(p4),
15b0: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65   P4_INT32);.  re
15c0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
15d0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
15e0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
15f0: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1600: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1610: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1620: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1630: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
1640: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
1650: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
1660: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
1670: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
1680: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
1690: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
16a0: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
16b0: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
16c0: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
16d0: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
16e0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
16f0: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1700: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1710: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1720: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1730: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
1740: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
1750: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
1760: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
1770: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
1780: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
1790: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
17a0: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
17b0: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
17c0: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
17d0: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
17e0: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
17f0: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1800: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1810: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1820: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1830: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
1840: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
1850: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1860: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
1870: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
1880: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
1890: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
18a0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
18b0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
18c0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
18d0: 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c   n = p->nLabelAl
18e0: 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 70  loc*2 + 5;.    p
18f0: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
1900: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1910: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1920: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73 69 7a             n*siz
1950: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
1960: 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65  ));.    p->nLabe
1970: 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  lAlloc = sqlite3
1980: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
1990: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 2f 73  db, p->aLabel)/s
19a0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
19b0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0]);.  }.  if( p
19c0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
19d0: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
19e0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
19f0: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
1a00: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
1a10: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
1a20: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
1a30: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
1a40: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
1a50: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
1a60: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1a70: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1a80: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
1a90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1aa0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
1ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1ac0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  lveLabel(Vdbe *p
1ad0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20  , int x){.  int 
1ae0: 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65  j = -1-x;.  asse
1af0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1b00: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1b10: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
1b20: 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  && j<p->nLabel )
1b30: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
1b40: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1b50: 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  el[j] = p->nOp;.
1b60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
1b70: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
1b80: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
1b90: 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e  be run one time.
1ba0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1bb0: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
1bc0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
1bd0: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a  unOnlyOnce = 1;.
1be0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1bf0: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
1c00: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
1c10: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
1c20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1c30: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
1c40: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
1c50: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1c60: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
1c70: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
1c80: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
1c90: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
1ca0: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
1cb0: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
1cc0: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
1cd0: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
1ce0: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
1cf0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
1d00: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
1d10: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
1d20: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
1d30: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
1d40: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
1d50: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
1d80: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
1d90: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
1da0: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
1db0: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
1dc0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
1dd0: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
1de0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
1df0: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
1e00: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
1e10: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
1e20: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
1e30: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
1e40: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
1e70: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
1e80: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
1e90: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
1ea0: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
1eb0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
1ec0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ef0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
1f00: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
1f30: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1f40: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
1f50: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
1f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
1f70: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
1f80: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
1f90: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
1fa0: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
1fb0: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
1fc0: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
1fd0: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
1fe0: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
1ff0: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
2000: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
2010: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
2020: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
2030: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
2040: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2050: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
2060: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
2070: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
2080: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
2090: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
20a0: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
20b0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
20c0: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
20d0: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
20e0: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
20f0: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
2100: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
2110: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
2120: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
2130: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
2140: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
2150: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
2160: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
2170: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
2180: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
2190: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
21a0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
21b0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
21c0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
21d0: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
21e0: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
21f0: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
2200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2210: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
2220: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
2230: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2240: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
2250: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
2260: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2270: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
2280: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
2290: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
22b0: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
22c0: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
22d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
2300: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
2310: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
2320: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
2330: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
2340: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
2350: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
2360: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
2370: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
2380: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
2390: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
23a0: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
23b0: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
23c0: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
23d0: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
23e0: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
23f0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
2400: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2410: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
2420: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2430: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2440: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2450: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
2460: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
2470: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
2480: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
2490: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
24a0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
24b0: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
24c0: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
24d0: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
24e0: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
24f0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2500: 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54  straint).**.** T
2510: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
2520: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
2530: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
2540: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
2550: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
2560: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2570: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
2580: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
2590: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
25a0: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
25b0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
25c0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
25d0: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
25e0: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
25f0: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
2600: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
2610: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
2620: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
2630: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
2640: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
2650: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
2660: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
2670: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
2680: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
2690: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
26a0: 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  ort = 0;.  Op *p
26b0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72  Op;.  VdbeOpIter
26c0: 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74   sIter;.  memset
26d0: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
26e0: 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49  of(sIter));.  sI
26f0: 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68  ter.v = v;..  wh
2700: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2710: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21  erNext(&sIter))!
2720: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70  =0 ){.    int op
2730: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
2740: 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  de;.    if( opco
2750: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c  de==OP_Destroy |
2760: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  | opcode==OP_VUp
2770: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
2780: 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e  OP_VRename .#ifn
2790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27a0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
27b0: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
27c0: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
27d0: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
27e0: 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20  p2==1) .#endif. 
27f0: 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d      || ((opcode=
2800: 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f  =OP_Halt || opco
2810: 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  de==OP_HaltIfNul
2820: 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 70 4f  l) .      && (pO
2830: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->p1==SQLITE_CO
2840: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
2850: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a  >p2==OE_Abort)).
2860: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73      ){.      has
2870: 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  Abort = 1;.     
2880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2890: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
28a0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
28b0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
28c0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
28d0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
28e0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
28f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a  ailure occured..
2900: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66    ** If malloc f
2910: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ailed, then the 
2920: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f  while() loop abo
2930: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ve may not have 
2940: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68  iterated.  ** th
2950: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
2960: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d  s and hasAbort m
2970: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  ay be set incorr
2980: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20  ectly. Return.  
2990: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73  ** true for this
29a0: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74   case to prevent
29b0: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e   the assert() in
29c0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61   the callers fra
29d0: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69  me.  ** from fai
29e0: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75  ling.  */.  retu
29f0: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c  rn ( v->db->mall
2a00: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41  ocFailed || hasA
2a10: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29  bort==mayAbort )
2a20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2a30: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
2a40: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2a50: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
2a60: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
2a70: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
2a80: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
2a90: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
2aa0: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
2ab0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
2ac0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
2ad0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
2ae0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
2af0: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
2b00: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
2b10: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
2b20: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
2b30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2b40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
2b50: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
2b60: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
2b70: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
2b80: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
2b90: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
2ba0: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
2bb0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
2bc0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
2bd0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
2be0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
2bf0: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
2c00: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
2c10: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
2c20: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
2c30: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
2c40: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
2c50: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
2c60: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
2c70: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
2c80: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
2c90: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
2ca0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
2cb0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
2cc0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
2cd0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
2ce0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a  Op *pOp;.  int *
2cf0: 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62  aLabel = p->aLab
2d00: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
2d10: 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28 70 4f 70  y = 1;.  for(pOp
2d20: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2d30: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2d40: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  pOp++){.    u8 o
2d50: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
2d60: 6f 64 65 3b 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f  ode;..    pOp->o
2d70: 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  pflags = sqlite3
2d80: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f  OpcodeProperty[o
2d90: 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20  pcode];.    if( 
2da0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
2db0: 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ion || opcode==O
2dc0: 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20 20  P_AggStep ){.   
2dd0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e     if( pOp->p5>n
2de0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2df0: 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  gs = pOp->p5;.  
2e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 70 63    }else if( (opc
2e10: 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74  ode==OP_Transact
2e20: 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d  ion && pOp->p2!=
2e30: 30 29 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  0) || opcode==OP
2e40: 5f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  _Vacuum ){.     
2e50: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2e60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2e70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e80: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
2e90: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2ea0: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
2eb0: 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67   pOp->p2>nMaxArg
2ec0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
2ed0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73  Op->p2;.    }els
2ee0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2ef0: 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  _VFilter ){.    
2f00: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61    int n;.      a
2f10: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20  ssert( p->nOp - 
2f20: 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20  i >= 3 );.      
2f30: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
2f40: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
2f50: 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  er );.      n = 
2f60: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
2f70: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
2f80: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
2f90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
2fa0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
2fb0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  lags & OPFLG_JUM
2fc0: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  P)!=0 && pOp->p2
2fd0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
2fe0: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
2ff0: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
3000: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
3010: 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a  el[-1-pOp->p2];.
3020: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
3030: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
3040: 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70   p->aLabel);.  p
3050: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20  ->aLabel = 0;.. 
3060: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
3070: 20 6e 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a   nMaxArgs;.}../*
3080: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
3090: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
30a0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
30b0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
30c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
30d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
30e0: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
30f0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3100: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3110: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3130: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3140: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3150: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
3160: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
3170: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
3180: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3190: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
31a0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
31b0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
31c0: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
31d0: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
31e0: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
31f0: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3200: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3210: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3220: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3230: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3240: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3250: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3260: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
3270: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
3280: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
3290: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
32a0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
32b0: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
32c0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
32d0: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
32e0: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
32f0: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3300: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3310: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3320: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3330: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3340: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3350: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3360: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3370: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3380: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3390: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
33a0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
33b0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
33c0: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
33d0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
33e0: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  M */.  assert( p
33f0: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
3400: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3410: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3420: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3430: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3440: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3460: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3470: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3480: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3490: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
34a0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
34b0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
34c0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
34d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
34e0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
34f0: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3500: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
3510: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
3520: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
3530: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3540: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
3550: 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  p > p->nOpAlloc 
3560: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
3570: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3580: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
3590: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
35a0: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
35b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
35c0: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
35d0: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
35e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
35f0: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
3600: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
3610: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
3620: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
3630: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
3640: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
3650: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
3660: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
3670: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
3680: 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33  p2<0 && (sqlite3
3690: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
36a0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  Out->opcode] & O
36b0: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b  PFLG_JUMP)!=0 ){
36c0: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
36d0: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
36e0: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
36f0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
3700: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
3710: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
3720: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
3730: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
3740: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
3750: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
3760: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
3770: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
3780: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
3790: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
37a0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
37b0: 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
37c0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
37d0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
37e0: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
37f0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
3800: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
3810: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
3820: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
3830: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
3840: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3850: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
3860: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
3870: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
3880: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
3890: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
38a0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
38b0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
38c0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
38d0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
38e0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
38f0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
3900: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
3910: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
3920: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
3930: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3940: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
3950: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
3960: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
3980: 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  r>=0 );.  if( p-
3990: 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20  >nOp>addr ){.   
39a0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
39b0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
39c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
39d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
39e0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
39f0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3a00: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3a10: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3a20: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3a30: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3a50: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
3a60: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3a70: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3a80: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
3a90: 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20  t( addr>=0 );.  
3aa0: 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20  if( p->nOp>addr 
3ab0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
3ac0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
3ad0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3ae0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3af0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
3b00: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
3b10: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3b20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3b30: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69  ngeP3(Vdbe *p, i
3b40: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
3b50: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3b60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
3b70: 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ddr>=0 );.  if( 
3b80: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20  p->nOp>addr ){. 
3b90: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3ba0: 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p3 = val;.  }.}.
3bb0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3bc0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3bd0: 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68  5 operand for th
3be0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a  e most recently.
3bf0: 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69  ** added operati
3c00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3c10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
3c20: 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29  Vdbe *p, u8 val)
3c30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3c40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
3c50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3c60: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
3c70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3c80: 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p5 = val;.  }.}
3c90: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3ca0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
3cb0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
3cc0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
3cd0: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
3ce0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
3cf0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
3d00: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
3d10: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
3d20: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
3d30: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73  int addr){.  ass
3d40: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
3d50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3d60: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
3d70: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
3d80: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
3d90: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
3da0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
3db0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
3dc0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
3dd0: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
3de0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
3df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3e00: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3e10: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
3e20: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
3e30: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
3e40: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
3e50: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3e60: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
3e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3e80: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
3e90: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
3ea0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
3eb0: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
3ec0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
3ed0: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
3ee0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
3f00: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
3f10: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
3f20: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
3f30: 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p4 ){.    assert
3f40: 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74  ( db );.    swit
3f50: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
3f60: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
3f70: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f80: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
3f90: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
3fa0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
3fb0: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
3fc0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20  P4_INTARRAY:.   
3fd0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
3fe0: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
3ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4000: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4020: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4030: 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20  4_MPRINTF: {.   
4040: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4050: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4060: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b  qlite3_free(p4);
4070: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4090: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
40a0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
40b0: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
40c0: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a  (VdbeFunc *)p4;.
40d0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
40e0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
40f0: 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  , pVdbeFunc->pFu
4100: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
4110: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4120: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
4130: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
4140: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
4150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4160: 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75  Free(db, pVdbeFu
4170: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
4180: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4190: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
41a0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
41b0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
41c0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
41d0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
41e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
41f0: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4200: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4210: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4220: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4230: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4240: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4250: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
4260: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
4270: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
4280: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4290: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
42a0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
42b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
42c0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
42d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
42e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
42f0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4300: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4310: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4320: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4330: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4340: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4350: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4360: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4370: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4380: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4390: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
43a0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
43b0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
43c0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
43d0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
43e0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
43f0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4400: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4420: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4430: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4440: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4450: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4460: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4470: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4480: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4490: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
44a0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
44b0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
44c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
44d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
44e0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
44f0: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
4500: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
4510: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4520: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  aOp);.}../*.** L
4530: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
4540: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
4550: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
4560: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
4570: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
4580: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
4590: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
45a0: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
45b0: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
45c0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
45d0: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
45e0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
45f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4600: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
4610: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
4620: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
4630: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
4640: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
4650: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
4660: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
4670: 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61  ge N opcodes sta
4680: 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f  rting at addr to
4690: 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64   No-ops..*/.void
46a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
46b0: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
46c0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
46d0: 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70  N){.  if( p->aOp
46e0: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
46f0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
4700: 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr];.    sqlite3
4710: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
4720: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
4730: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4740: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4750: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20  p->p4.p);.      
4760: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
4770: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
4780: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
4790: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
47a0: 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a     pOp++;.    }.
47b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
47c0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
47d0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
47e0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
47f0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
4800: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4810: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
4820: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
4830: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
4840: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
4850: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
4860: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
4870: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
4880: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
4890: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
48a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
48b0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
48c0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
48d0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
48e0: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
48f0: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
4900: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4910: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4920: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
4930: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
4940: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
4950: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
4960: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
4970: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
4980: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
4990: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
49a0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
49b0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
49c0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
49d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
49e0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
49f0: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
4a00: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
4a10: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
4a20: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4a30: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
4a40: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
4a50: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4a60: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
4a70: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
4a80: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
4a90: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
4aa0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
4ab0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
4ac0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
4ad0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
4ae0: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
4af0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4b00: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
4b10: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
4b20: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
4b30: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
4b40: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4b50: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
4b60: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
4b70: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
4b80: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
4b90: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
4ba0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
4bb0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
4bc0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
4bd0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
4be0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
4bf0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
4c00: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
4c10: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
4c20: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
4c30: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
4c40: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
4c50: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
4c60: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
4c70: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
4c80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4c90: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
4ca0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
4cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
4cc0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
4cd0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
4ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
4cf0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
4d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4d10: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4d20: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4d30: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
4d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4d50: 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b      if ( n!=P4_K
4d60: 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f  EYINFO && n!=P4_
4d70: 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20 66  VTAB ) {.      f
4d80: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
4d90: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
4da0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
4db0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4dc0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
4dd0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
4de0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
4df0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
4e00: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
4e10: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
4e20: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
4e30: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4e40: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4e50: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
4e60: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
4e70: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
4e80: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
4e90: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
4ea0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
4eb0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
4ec0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
4ed0: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
4ee0: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
4ef0: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
4f00: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
4f10: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
4f20: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
4f30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
4f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
4f50: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
4f60: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
4f70: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
4f80: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
4f90: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
4fa0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
4fb0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
4fc0: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
4fd0: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
4fe0: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
4ff0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
5000: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
5010: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
5020: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
5030: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
5040: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
5050: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
5060: 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  Byte);.    pOp->
5070: 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p4.pKeyInfo = pK
5080: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  eyInfo;.    if( 
5090: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
50a0: 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72    u8 *aSortOrder
50b0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28  ;.      memcpy((
50c0: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
50d0: 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69  zP4, nByte - nFi
50e0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f 72  eld);.      aSor
50f0: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
5100: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  o->aSortOrder;. 
5110: 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72       if( aSortOr
5120: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  der ){.        p
5130: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5140: 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  der = (unsigned 
5150: 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d  char*)&pKeyInfo-
5160: 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a  >aColl[nField];.
5170: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
5180: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5190: 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c  der, aSortOrder,
51a0: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
51b0: 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  }.      pOp->p4t
51c0: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
51d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
51e0: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
51f0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5200: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5210: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
5220: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
5230: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
5240: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
5250: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5260: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5270: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
5280: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
5290: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  P4_VTAB ){.    p
52a0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
52b0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
52c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42  p4type = P4_VTAB
52d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
52e0: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  bLock((VTable *)
52f0: 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zP4);.    assert
5300: 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ( ((VTable *)zP4
5310: 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  )->db==p->db );.
5320: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
5330: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5340: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5350: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5360: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
5370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
5380: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
5390: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
53a0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
53b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
53c0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
53d0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
53e0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
53f0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5400: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
5410: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
5420: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
5430: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
5440: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
5450: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
5460: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
5470: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
5480: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
5490: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
54a0: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
54b0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
54c0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
54d0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
54e0: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
54f0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
5500: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
5510: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
5520: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5530: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
5540: 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20 29  t ap;.  if( !p )
5550: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
5560: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
5570: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
5580: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
5590: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
55a0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
55b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
55c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
55d0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
55e0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
55f0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
5600: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
5610: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
5620: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5630: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
5640: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
5650: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
5660: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5670: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
5680: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
5690: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
56a0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
56b0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
56c0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
56d0: 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  p;.  if( !p ) re
56e0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
56f0: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
5700: 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28  Noop);.  assert(
5710: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
5720: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
5730: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
5740: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5750: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
5760: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5770: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5780: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72  >nOp ){.    char
5790: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b   **pz = &p->aOp[
57a0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
57b0: 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  nt;.    va_start
57c0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
57d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
57e0: 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20  (p->db, *pz);.  
57f0: 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56    *pz = sqlite3V
5800: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5810: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
5820: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5830: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
5840: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EBUG */../*.** R
5850: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
5860: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
5870: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
5880: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
5890: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
58a0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
58b0: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
58c0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
58d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
58e0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
58f0: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
5900: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
5910: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
5920: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
5930: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
5940: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
5950: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
5960: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
5970: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
5980: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
5990: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
59a0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
59b0: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
59c0: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
59d0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
59e0: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
59f0: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74   a OOM fault wit
5a00: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
5a10: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
5a20: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
5a30: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5a40: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
5a50: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
5a60: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
5a70: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
5a80: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
5a90: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
5aa0: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
5ab0: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
5ac0: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
5ad0: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
5ae0: 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65  .**.** About the
5af0: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
5b00: 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d  MIT_TRACE:  Norm
5b10: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
5b20: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
5b30: 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e  ed.** unless p->
5b40: 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20  nOp>0.  This is 
5b50: 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20 61  because in the a
5b60: 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45  bsense of SQLITE
5b70: 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20  _OMIT_TRACE,.** 
5b80: 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74  an OP_Trace inst
5b90: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ruction is alway
5ba0: 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73 71  s inserted by sq
5bb0: 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20 61  lite3VdbeGet() a
5bc0: 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e  s soon as.** a n
5bd0: 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61 74  ew VDBE is creat
5be0: 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66  ed.  So we are f
5bf0: 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72 20  ree to set addr 
5c00: 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68  to p->nOp-1 with
5c10: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
5c20: 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f   double-check to
5c30: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5c40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
5c50: 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a  n-negative. But.
5c60: 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** if SQLITE_OMI
5c70: 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69 6e  T_TRACE is defin
5c80: 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65  ed, the OP_Trace
5c90: 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
5ca0: 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a  we do need to.**
5cb0: 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   check the value
5cc0: 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66   of p->nOp-1 bef
5cd0: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a  ore continuing..
5ce0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
5cf0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
5d00: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
5d10: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
5d20: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
5d30: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
5d40: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
5d50: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
5d60: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
5d70: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
5d80: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
5d90: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
5da0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
5db0: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
5dc0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
5dd0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
5de0: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
5df0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
5e00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5e10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
5e20: 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65 66  addr<0 ){.#ifdef
5e30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5e40: 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  CE.    if( p->nO
5e50: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 56  p==0 ) return (V
5e60: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23  dbeOp*)&dummy;.#
5e70: 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20 3d  endif.    addr =
5e80: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
5e90: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
5ea0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
5eb0: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
5ec0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5ed0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
5ee0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
5ef0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
5f00: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
5f10: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
5f20: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
5f30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5f40: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5f50: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
5f60: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
5f70: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
5f80: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
5f90: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5fa0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
5fb0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
5fc0: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
5fd0: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
5fe0: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
5ff0: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
6000: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
6010: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
6020: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
6030: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
6040: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
6050: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
6060: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61  zP4 = zTemp;.  a
6070: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
6080: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
6090: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
60a0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
60b0: 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73  _STATIC:.    cas
60c0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
60d0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
60e0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
60f0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
6100: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
6110: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6120: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6130: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
6140: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
6150: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69  ;.      i = sqli
6160: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
6170: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
6180: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
6190: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
61a0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
61b0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
61c0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
61d0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
61e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
61f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6200: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pColl->zName);.
6210: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
6220: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
6230: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6240: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
6250: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,4);.           
6260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6270: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54    }.          zT
6280: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  emp[i++] = ',';.
6290: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b            if( pK
62a0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
62b0: 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e  er && pKeyInfo->
62c0: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
62d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65  .            zTe
62e0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
62f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6300: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
6310: 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  mp[i], pColl->zN
6320: 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20  ame,n+1);.      
6330: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
6340: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b      }else if( i+
6350: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  4<nTemp-6 ){.   
6360: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
6370: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34  Temp[i],",nil",4
6380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6390: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
63a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
63b0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  mp[i++] = ')';. 
63c0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20       zTemp[i] = 
63d0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
63e0: 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20   i<nTemp );.    
63f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6400: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
6410: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
6420: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
6430: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
6440: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6450: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6460: 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29   "collseq(%.20s)
6470: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
6480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6490: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
64a0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
64b0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
64c0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
64d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
64e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
64f0: 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20  Temp, "%s(%d)", 
6500: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
6510: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
6520: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6530: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
6540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6550: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6560: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a  zTemp, "%lld", *
6570: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20  pOp->p4.pI64);. 
6580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6590: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
65a0: 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T32: {.      sql
65b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
65c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22  emp, zTemp, "%d"
65d0: 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20  , pOp->p4.i);.  
65e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
65f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41  .    case P4_REA
6600: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
6610: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6620: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
6630: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61  ", *pOp->p4.pRea
6640: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
6650: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6660: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
6670: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d  Mem *pMem = pOp-
6680: 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20  >p4.pMem;.      
6690: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
66a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
66b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
66c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
66d0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
66e0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
66f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6700: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6710: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
6720: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6730: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6740: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
6750: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
6760: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6770: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
6780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6790: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
67a0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
67b0: 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d  Mem->r);.      }
67c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
67d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
67e0: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
67f0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28          zP4 = "(
6800: 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a  blob)";.      }.
6810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6820: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6830: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
6840: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
6850: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
6860: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
6870: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
6880: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b->pVtab;.      
6890: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
68a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
68b0: 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74  vtab:%p:%p", pVt
68c0: 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ab, pVtab->pModu
68d0: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
68e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
68f0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
6900: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAY: {.      sql
6910: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6920: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74  emp, zTemp, "int
6930: 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62  array");.      b
6940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6950: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
6960: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
6970: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6980: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67  mp, zTemp, "prog
6990: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
69a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
69b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
69c0: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
69d0: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
69e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
69f0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
6a00: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6a10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6a20: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
6a30: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
6a40: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
6a50: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
6a60: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
6a70: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
6a80: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
6a90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
6aa0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6ab0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
6ac0: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
6ad0: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
6ae0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6af0: 73 65 73 20 74 68 61 74 20 74 68 65 79 20 77 69  ses that they wi
6b00: 6c 6c 20 62 65 20 75 73 69 6e 67 2e 20 20 41 20  ll be using.  A 
6b10: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
6b20: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
6b30: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
6b40: 74 72 65 65 4d 61 73 6b 20 61 6e 64 20 69 73 20  treeMask and is 
6b50: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
6b60: 20 61 6e 64 20 6f 74 68 65 72 20 70 75 72 70 6f   and other purpo
6b70: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
6b80: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6b90: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
6ba0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
6bb0: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
6bc0: 62 20 26 26 20 69 3c 73 69 7a 65 6f 66 28 79 44  b && i<sizeof(yD
6bd0: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
6be0: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
6bf0: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
6c00: 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65  )*8 );.  p->btre
6c10: 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61  eMask |= ((yDbMa
6c20: 73 6b 29 31 29 3c 3c 69 3b 0a 7d 0a 0a 23 69 66  sk)1)<<i;.}..#if
6c30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
6c50: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
6c60: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
6c70: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
6c80: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
6c90: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
6ca0: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
6cb0: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
6cc0: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
6cd0: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
6ce0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
6cf0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
6d00: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
6d10: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
6d20: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
6d30: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
6d40: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
6d50: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
6d60: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
6d70: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
6d80: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
6d90: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
6da0: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
6db0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
6dc0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
6dd0: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
6de0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
6df0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
6e00: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
6e10: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
6e20: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
6e30: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
6e40: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
6e50: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
6e60: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
6e70: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
6e80: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
6e90: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
6ea0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
6eb0: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
6ec0: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
6ed0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
6ee0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
6ef0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
6f00: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
6f10: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
6f20: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
6f30: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
6f40: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
6f50: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
6f60: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
6f70: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
6f80: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
6f90: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
6fa0: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
6fb0: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
6fc0: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
6fd0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
6fe0: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
6ff0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
7000: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
7010: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
7020: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
7030: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
7040: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
7050: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
7060: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
7070: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
7080: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
7090: 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b  int i;.  yDbMask
70a0: 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33   mask;.  sqlite3
70b0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
70c0: 44 62 20 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44  Db *aDb = db->aD
70d0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 20 3d 20 64  b;.  int nDb = d
70e0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
70f0: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62  0, mask=1; i<nDb
7100: 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d  ; i++, mask += m
7110: 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  ask){.    if( i!
7120: 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d  =1 && (mask & p-
7130: 3e 62 74 72 65 65 4d 61 73 6b 29 21 3d 30 20 26  >btreeMask)!=0 &
7140: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
7150: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
7160: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
7170: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
7180: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
7190: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
71a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
71b0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
71c0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
71d0: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
71e0: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
71f0: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
7200: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
7210: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
7220: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
7230: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
7240: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
7250: 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
7260: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7270: 70 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  p->db;.  Db *aDb
7280: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 69 6e   = db->aDb;.  in
7290: 74 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b  t nDb = db->nDb;
72a0: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73  ..  for(i=0, mas
72b0: 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c  k=1; i<nDb; i++,
72c0: 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a   mask += mask){.
72d0: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
72e0: 28 6d 61 73 6b 20 26 20 70 2d 3e 62 74 72 65 65  (mask & p->btree
72f0: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
7300: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
7310: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7320: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
7330: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
7340: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
7350: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
7360: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
7370: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
7380: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
7390: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
73a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
73b0: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
73c0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
73d0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
73e0: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
73f0: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
7400: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
7410: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
7420: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7430: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
7440: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
7450: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
7460: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
7470: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
7480: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
7490: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
74a0: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
74b0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
74c0: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
74d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
74e0: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
74f0: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
7500: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
7510: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
7520: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7530: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
7540: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
7550: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
7560: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
7570: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
7580: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
7590: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
75a0: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
75b0: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
75c0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
75d0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
75e0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
75f0: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
7600: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
7610: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7620: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
7630: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
7640: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
7650: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
7660: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
7670: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
7680: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
7690: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
76a0: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
76b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
76c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
76d0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
76e0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
76f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
7700: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
7710: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7720: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7730: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7740: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
7750: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
7760: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
7770: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
7780: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
7790: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
77a0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
77b0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
77c0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
77d0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
77e0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
77f0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
7800: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7810: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7820: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7830: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7840: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7850: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7860: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7870: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7880: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7890: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
78a0: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
78b0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
78c0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
78d0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
78e0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
78f0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
7900: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7910: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7920: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7930: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7940: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7950: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7960: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7970: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7980: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7990: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
79a0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
79b0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
79c0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
79d0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
79e0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
79f0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7a00: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7a10: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7a20: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7a30: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7a40: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7a50: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7a60: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7a70: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7a80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7a90: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7aa0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
7ab0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
7ac0: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
7ad0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
7ae0: 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  }.    db->malloc
7af0: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
7b00: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
7b10: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
7b20: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
7b30: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
7b40: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7b50: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
7b60: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
7b70: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
7b80: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
7b90: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7ba0: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
7bb0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
7bc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
7bd0: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
7be0: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
7bf0: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
7c00: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
7c10: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
7c20: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
7c30: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
7c40: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
7c50: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
7c60: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
7c70: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
7c80: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
7c90: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
7ca0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
7cb0: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
7cc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7cd0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
7ce0: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
7cf0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
7d00: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
7d10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
7d20: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
7d30: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
7d40: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
7d50: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
7d60: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
7d70: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
7d80: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
7d90: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
7da0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
7db0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
7dc0: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
7dd0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
7de0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
7df0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
7e00: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
7e10: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
7e20: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
7e30: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
7e40: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
7e50: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
7e60: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
7e70: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
7e80: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
7e90: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
7ea0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
7eb0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
7ec0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
7ed0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
7ee0: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
7ef0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
7f00: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
7f10: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
7f20: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
7f30: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
7f40: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
7f70: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
7fa0: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
7fb0: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
7fc0: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7ff0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
8000: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
8010: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
8020: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
8030: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
8040: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
8050: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
8080: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
8090: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
80a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
80b0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
80c0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
80d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
80e0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
8110: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
8120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8140: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
8150: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
8160: 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74   = p->pResultSet
8170: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
8180: 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66   /* First Mem of
8190: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
81a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
81b0: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
81c0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
81d0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
81e0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
81f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
8200: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
8210: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
8220: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
8230: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
8240: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
8250: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
8260: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
8270: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
8280: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
8290: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
82a0: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
82b0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
82c0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
82d0: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
82e0: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
82f0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
8300: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
8310: 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  , 8);..  if( p->
8320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
8330: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
8340: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
8350: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
8360: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
8370: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
8380: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
8390: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
83a0: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
83b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
83c0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
83d0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
83e0: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
83f0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
8400: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
8410: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
8420: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
8430: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
8440: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
8450: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
8460: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
8470: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
8480: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8490: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
84a0: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
84b0: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
84c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
84d0: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
84e0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
84f0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
8500: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
8510: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
8520: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
8530: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
8540: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
8550: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
8560: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
8570: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
8580: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
8590: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
85a0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
85b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
85c0: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
85d0: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
85e0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
85f0: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
8600: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
8610: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
8620: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
8630: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
8640: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
8650: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
8660: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
8670: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
8680: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
8690: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
86a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
86b0: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
86c0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
86d0: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
86e0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
86f0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
8700: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
8710: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
8720: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
8730: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
8740: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
8750: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
8760: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
8770: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
8780: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
8790: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
87a0: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
87b0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
87c0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
87d0: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
87e0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
87f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
8800: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
8810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
8820: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
8830: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
8840: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
8850: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
8860: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
8870: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
8880: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
8890: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
88a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
88b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
88c0: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
88d0: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
88e0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
88f0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
8900: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
8910: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
8920: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
8930: 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
8940: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
8950: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8960: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20  char *z;.    Op 
8970: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
8980: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
8990: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
89a0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
89b0: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
89c0: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
89d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
89e0: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
89f0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
8a00: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
8a10: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
8a20: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
8a30: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
8a40: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
8a50: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
8a60: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
8a70: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
8a80: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
8a90: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
8aa0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
8ab0: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
8ac0: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
8ad0: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
8ae0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
8af0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
8b00: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
8b10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
8b20: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
8b30: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8b40: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
8b50: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
8b60: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
8b70: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
8b80: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
8bb0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  nter */.      pM
8bc0: 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70  em++;.  .      p
8bd0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8be0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
8bf0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
8c00: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
8c10: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
8c20: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
8c30: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
8c40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
8c50: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
8c60: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
8c70: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
8c80: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
8c90: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
8ca0: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
8cb0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
8cc0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
8cd0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
8ce0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
8cf0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
8d00: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
8d10: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
8d20: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
8d30: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
8d40: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
8d50: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
8d60: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
8d70: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
8d80: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
8d90: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
8da0: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
8db0: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
8dc0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
8dd0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
8de0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8df0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
8e00: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
8e10: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
8e20: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
8e30: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
8e40: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
8e50: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
8e60: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
8e70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8e80: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
8e90: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
8ea0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8eb0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
8ec0: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
8ed0: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
8ee0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
8ef0: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
8f00: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
8f10: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
8f20: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
8f30: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
8f40: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
8f50: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
8f60: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
8f70: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
8f80: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
8f90: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
8fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8fb0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
8fc0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8fd0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
8fe0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
9010: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9020: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
9030: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
9040: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
9050: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
9060: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
9090: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
90a0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
90b0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
90c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
90d0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
90e0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
90f0: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
9100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9110: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  3 */.    pMem->t
9120: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
9130: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
9140: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
9150: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
9160: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20  em, 32, 0) ){   
9170: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
9180: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9190: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
91a0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
91b0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
91c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
91d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
91e0: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
91f0: 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70  rm;.    z = disp
9200: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
9210: 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28  >z, 32);.    if(
9220: 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20   z!=pMem->z ){. 
9230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9240: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
9250: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  z, -1, SQLITE_UT
9260: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
9270: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9280: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
9290: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
92a0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
92b0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
92c0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
92d0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
92e0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
92f0: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9300: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
9310: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9320: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9330: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
9340: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20  Mem, 4, 0) ){.  
9350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9360: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9370: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
9380: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
9390: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
93a0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
93b0: 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45  M_Dyn|MEM_Str|ME
93c0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
93d0: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20  em->n = 2;.     
93e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
93f0: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
9400: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
9410: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
9420: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9430: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
9440: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
9450: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
9460: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65  pMem++;.  .#ifde
9470: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9480: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43       if( pOp->zC
9490: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
94a0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
94b0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
94c0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
94d0: 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  z = pOp->zCommen
94e0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  t;.        pMem-
94f0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
9500: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
9510: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
9520: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
9530: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
9540: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
9550: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
9560: 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
9570: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
9580: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
95b0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
95c0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ype = SQLITE_NUL
95d0: 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  L;.      }.    }
95e0: 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  ..    p->nResCol
95f0: 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e  umn = 8 - 4*(p->
9600: 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20  explain-1);.    
9610: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
9620: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
9630: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
9640: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
9650: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9660: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
9670: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9680: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
9690: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
96a0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
96b0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
96c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
96d0: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
96e0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
96f0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
9700: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
9710: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
9720: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
9730: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
9740: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
9750: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
9760: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9770: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  *z = pOp->p4.z;.
9780: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
9790: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
97a0: 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  z++;.    printf(
97b0: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
97c0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
97d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
97e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
97f0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9800: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
9810: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
9820: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
9830: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
9840: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
9850: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
9860: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
9870: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
9880: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
9890: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
98a0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
98b0: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
98c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
98d0: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
98e0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
98f0: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
9900: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
9910: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
9920: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
9930: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9940: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
9950: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
9960: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
9970: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
9980: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
9990: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
99a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
99b0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
99c0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
99d0: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
99e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
99f0: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
9a00: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9a10: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
9a20: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
9a30: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
9a40: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
9a50: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
9a60: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
9a70: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9a80: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
9a90: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
9aa0: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  CE */../*.** All
9ab0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d  ocate space from
9ac0: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75   a fixed size bu
9ad0: 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ffer and return 
9ae0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
9af0: 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20  that space.  If 
9b00: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
9b10: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ce is available,
9b20: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
9b30: 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72  .** The pBuf par
9b40: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e  ameter is the in
9b50: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61  itial value of a
9b60: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77   pointer which w
9b70: 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74  ill.** receive t
9b80: 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  he new memory.  
9b90: 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  pBuf is normally
9ba0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20   NULL.  If pBuf 
9bb0: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20  is not.** NULL, 
9bc0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65  it means that me
9bd0: 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61  mory space has a
9be0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
9bf0: 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a  cated and that.*
9c00: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
9c10: 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61  hould not alloca
9c20: 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72  te any new memor
9c30: 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73  y.  When pBuf is
9c40: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d   not.** NULL sim
9c50: 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e  ply return pBuf.
9c60: 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20    Only allocate 
9c70: 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  new memory space
9c80: 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73   when pBuf.** is
9c90: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   NULL..**.** nBy
9ca0: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
9cb0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
9cc0: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
9cd0: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20   *ppFrom points 
9ce0: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  to available spa
9cf0: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e  ce and pEnd poin
9d00: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ts to the end of
9d10: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   the.** availabl
9d20: 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73  e space.  When s
9d30: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
9d40: 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64  d, *ppFrom is ad
9d50: 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74  vanced past.** t
9d60: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c  he end of the al
9d70: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a  located space..*
9d80: 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20  *.** *pnByte is 
9d90: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  a counter of the
9da0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9db0: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68   of space that h
9dc0: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  ave failed.** to
9dd0: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74   allocate.  If t
9de0: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63  here is insuffic
9df0: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70  ient space in *p
9e00: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79  pFrom to satisfy
9e10: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c   the.** request,
9e20: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
9e30: 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61  *pnByte by the a
9e40: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71  mount of the req
9e50: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uest..*/.static 
9e60: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
9e70: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  (.  void *pBuf, 
9e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
9e90: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  e return pointer
9ea0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
9eb0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
9ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9ed0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
9ee0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38  allocate */.  u8
9ef0: 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20   **ppFrom,      
9f00: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c     /* IN/OUT: Al
9f10: 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46  locate from *ppF
9f20: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  rom */.  u8 *pEn
9f30: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
9f40: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
9f50: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
9f60: 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65  of *ppFrom buffe
9f70: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79  r */.  int *pnBy
9f80: 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  te          /* I
9f90: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  f allocation can
9fa0: 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63  not be made, inc
9fb0: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a  rement *pnByte *
9fc0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
9fd0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
9fe0: 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a  ENT(*ppFrom) );.
9ff0: 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74    if( pBuf ) ret
a000: 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74  urn pBuf;.  nByt
a010: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
a020: 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72  );.  if( &(*ppFr
a030: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45  om)[nByte] <= pE
a040: 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d  nd ){.    pBuf =
a050: 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b   (void*)*ppFrom;
a060: 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20  .    *ppFrom += 
a070: 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nByte;.  }else{.
a080: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e      *pnByte += n
a090: 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
a0a0: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
a0b0: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
a0c0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
a0d0: 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73  execution.  This
a0e0: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
a0f0: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
a100: 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61  cating stack spa
a110: 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ce and initializ
a120: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
a130: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
a140: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
a150: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
a160: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
a170: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
a180: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
a190: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
a1a0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
a1b0: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
a1c0: 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42   a VDBE from VDB
a1d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a  E_MAGIC_INIT to.
a1e0: 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  ** VDBE_MAGIC_RU
a1f0: 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  N..**.** This fu
a200: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
a210: 6c 6c 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  lled more than o
a220: 6e 63 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  nce on a single 
a230: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
a240: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 61  .** The first ca
a250: 6c 6c 20 69 73 20 6d 61 64 65 20 77 68 69 6c 65  ll is made while
a260: 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53   compiling the S
a270: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 75  QL statement. Su
a280: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c  bsequent.** call
a290: 73 20 61 72 65 20 6d 61 64 65 20 61 73 20 70 61  s are made as pa
a2a0: 72 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  rt of the proces
a2b0: 73 20 6f 66 20 72 65 73 65 74 74 69 6e 67 20 61  s of resetting a
a2c0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65   statement to be
a2d0: 0a 2a 2a 20 72 65 2d 65 78 65 63 75 74 65 64 20  .** re-executed 
a2e0: 28 66 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20  (from a call to 
a2f0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 29  sqlite3_reset())
a300: 2e 20 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d  . The nVar, nMem
a310: 2c 20 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e  , nCursor .** an
a320: 64 20 69 73 45 78 70 6c 61 69 6e 20 70 61 72 61  d isExplain para
a330: 6d 65 74 65 72 73 20 61 72 65 20 6f 6e 6c 79 20  meters are only 
a340: 70 61 73 73 65 64 20 63 6f 72 72 65 63 74 20 76  passed correct v
a350: 61 6c 75 65 73 20 74 68 65 20 66 69 72 73 74 20  alues the first 
a360: 74 69 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63  time.** the func
a370: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
a380: 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  On subsequent ca
a390: 6c 6c 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65  lls, from sqlite
a3a0: 33 5f 72 65 73 65 74 28 29 2c 20 6e 56 61 72 0a  3_reset(), nVar.
a3b0: 2a 2a 20 69 73 20 70 61 73 73 65 64 20 2d 31 20  ** is passed -1 
a3c0: 61 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f  and nMem, nCurso
a3d0: 72 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20  r and isExplain 
a3e0: 61 72 65 20 61 6c 6c 20 70 61 73 73 65 64 20 7a  are all passed z
a3f0: 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ero..*/.void sql
a400: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
a410: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
a440: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20  */.  int nVar,  
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a470: 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20   '?' see in the 
a480: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
a490: 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20  .  int nMem,    
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
a4c0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61  emory cells to a
a4d0: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llocate */.  int
a4e0: 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   nCursor,       
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a500: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
a510: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
a520: 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
a550: 65 72 20 6f 66 20 61 72 67 73 20 69 6e 20 53 75  er of args in Su
a560: 62 50 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bPrograms */.  i
a570: 6e 74 20 69 73 45 78 70 6c 61 69 6e 2c 20 20 20  nt isExplain,   
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a590: 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50   True if the EXP
a5a0: 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73  LAIN keywords is
a5b0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
a5c0: 74 20 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  t usesStmtJourna
a5d0: 6c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l            /* 
a5e0: 54 72 75 65 20 74 6f 20 73 65 74 20 56 64 62 65  True to set Vdbe
a5f0: 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  .usesStmtJournal
a600: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
a610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a620: 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  p->db;..  assert
a630: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
a640: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
a650: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
a660: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
a670: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
a680: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
a690: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
a6a0: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
a6b0: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
a6c0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
a6d0: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
a6e0: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
a6f0: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
a700: 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72  C_RUN;..  /* For
a710: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
a720: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
a730: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
a740: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
a750: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
a760: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
a770: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
a780: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
a790: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
a7a0: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
a7b0: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
a7c0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
a7d0: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
a7e0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
a7f0: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
a800: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
a810: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
a820: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
a830: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
a840: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
a850: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
a860: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
a870: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
a880: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
a890: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
a8a0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
a8b0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
a8c0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
a8d0: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
a8e0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
a8f0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
a900: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
a910: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
a920: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
a930: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
a940: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
a950: 65 6e 74 73 20 69 6e 2e 20 54 68 69 73 20 69 73  ents in. This is
a960: 20 6f 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20   only done the. 
a970: 20 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 74   ** first time t
a980: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a990: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 67 69 76  called for a giv
a9a0: 65 6e 20 56 44 42 45 2c 20 6e 6f 74 20 77 68 65  en VDBE, not whe
a9b0: 6e 20 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69  n it is.  ** bei
a9c0: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73  ng called from s
a9d0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 74  qlite3_reset() t
a9e0: 6f 20 72 65 73 65 74 20 74 68 65 20 76 69 72 74  o reset the virt
a9f0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a  ual machine..  *
aa00: 2f 0a 20 20 69 66 28 20 6e 56 61 72 3e 3d 30 20  /.  if( nVar>=0 
aa10: 26 26 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61  && ALWAYS(db->ma
aa20: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20 29  llocFailed==0) )
aa30: 7b 0a 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d  {.    u8 *zCsr =
aa40: 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70   (u8 *)&p->aOp[p
aa50: 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a  ->nOp];       /*
aa60: 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c   Memory avaliabl
aa70: 65 20 66 6f 72 20 61 6c 6c 6f 61 74 69 6f 6e 20  e for alloation 
aa80: 2a 2f 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 20  */.    u8 *zEnd 
aa90: 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b  = (u8 *)&p->aOp[
aaa0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f  p->nOpAlloc];  /
aab0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
aac0: 74 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 20  t available mem 
aad0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
aae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab00: 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61  * How much extra
ab10: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a   memory needed *
ab20: 2f 0a 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32  /..    resolveP2
ab30: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
ab40: 3b 0a 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d  ;.    p->usesStm
ab50: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  tJournal = (u8)u
ab60: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a  sesStmtJournal;.
ab70: 20 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69      if( isExplai
ab80: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
ab90: 20 20 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b        nMem = 10;
aba0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
abb0: 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d  t(zCsr, 0, zEnd-
abc0: 7a 43 73 72 29 3b 0a 20 20 20 20 7a 43 73 72 20  zCsr);.    zCsr 
abd0: 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29  += (zCsr - (u8*)
abe0: 30 29 26 37 3b 0a 20 20 20 20 61 73 73 65 72 74  0)&7;.    assert
abf0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
ac00: 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a  GNMENT(zCsr) );.
ac10: 0a 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  .    /* Memory f
ac20: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
ac30: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
ac40: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
ac50: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 20 20 2a  ted in two.    *
ac60: 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68  * passes.  On th
ac70: 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65  e first pass, we
ac80: 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e   try to reuse un
ac90: 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68  used space at th
aca0: 65 20 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  e .    ** end of
acb0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
acc0: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
acd0: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
ace0: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a  all memory.    *
acf0: 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
ad00: 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
ad10: 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
ad20: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
ad30: 0a 20 20 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  .    ** pass wil
ad40: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
ad50: 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68  st using a fresh
ad60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
ad70: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
ad80: 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f  s two-pass appro
ad90: 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20  ach that reuses 
ada0: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
adb0: 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a  s possible from.
adc0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f      ** the lefto
add0: 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65  ver space at the
ade0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
adf0: 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67  de array can sig
ae00: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 20 20 2a  nificantly.    *
ae10: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
ae20: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
ae30: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
ae40: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
ae50: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
ae60: 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    nByte = 0;.   
ae70: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
ae80: 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c  ocSpace(p->aMem,
ae90: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
aea0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
aeb0: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70  &nByte);.      p
aec0: 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  ->aVar = allocSp
aed0: 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61  ace(p->aVar, nVa
aee0: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  r*sizeof(Mem), &
aef0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
af00: 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  te);.      p->ap
af10: 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Arg = allocSpace
af20: 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a  (p->apArg, nArg*
af30: 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a  sizeof(Mem*), &z
af40: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
af50: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56  e);.      p->azV
af60: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
af70: 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73  p->azVar, nVar*s
af80: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a  izeof(char*), &z
af90: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
afa0: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  e);.      p->apC
afb0: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
afc0: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
afd0: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
afe0: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20     &zCsr, zEnd, 
b010: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69  &nByte);.      i
b020: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
b030: 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73      p->pFree = s
b040: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
b050: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
b060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 73       }.      zCs
b070: 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20  r = p->pFree;.  
b080: 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72      zEnd = &zCsr
b090: 5b 6e 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68  [nByte];.    }wh
b0a0: 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64  ile( nByte && !d
b0b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b0c0: 29 3b 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73  );..    p->nCurs
b0d0: 6f 72 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f  or = (u16)nCurso
b0e0: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 56  r;.    if( p->aV
b0f0: 61 72 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ar ){.      p->n
b100: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61  Var = (ynVar)nVa
b110: 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30  r;.      for(n=0
b120: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
b130: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b          p->aVar[
b140: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
b150: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ull;.        p->
b160: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
b170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b180: 20 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29     if( p->aMem )
b190: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d  {.      p->aMem-
b1a0: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -;              
b1b0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
b1c0: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
b1d0: 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  Mem */.      p->
b1e0: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b200: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
b210: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
b220: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
b230: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
b240: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
b250: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
b260: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
b270: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
b280: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
b290: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b2a0: 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d  .  for(n=1; n<p-
b2b0: 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  >nMem; n++){.   
b2c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
b2d0: 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  [n].db==db );.  
b2e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70  }.#endif..  p->p
b2f0: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
b300: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
b310: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
b320: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65  OE_Abort;.  p->e
b330: 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c  xplain |= isExpl
b340: 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ain;.  p->magic 
b350: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
b360: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
b370: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
b380: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
b390: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
b3a0: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
b3b0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
b3c0: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
b3d0: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
b3e0: 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69  ROFILE.  {.    i
b3f0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
b400: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
b410: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  ){.      p->aOp[
b420: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
b430: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
b440: 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  es = 0;.    }.  
b450: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
b460: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
b470: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
b480: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
b490: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
b4a0: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
b4b0: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
b4c0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
b4d0: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
b4e0: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
b4f0: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
b500: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b510: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
b520: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
b530: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
b540: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d  .    /* The pCx-
b550: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
b560: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
b570: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
b580: 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  ts, by.    ** th
b590: 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f  e call above. */
b5a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78  .  }else if( pCx
b5b0: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
b5c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
b5d0: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43  seCursor(pCx->pC
b5e0: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
b5f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b600: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
b610: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
b620: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
b630: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
b640: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
b650: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
b660: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
b670: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
b680: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
b690: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
b6a0: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70  ethod = 1;.    p
b6b0: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
b6c0: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20  VtabCursor);.   
b6d0: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
b6e0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
b6f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
b700: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
b710: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
b720: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
b730: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
b740: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
b750: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
b760: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
b770: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
b780: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
b790: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
b7a0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
b7b0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
b7c0: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
b7d0: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
b7e0: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
b7f0: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
b800: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
b810: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
b820: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
b830: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
b840: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
b850: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
b860: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
b870: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
b880: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
b890: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
b8a0: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
b8b0: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
b8c0: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
b8d0: 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  nChange;.  retur
b8e0: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
b8f0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
b900: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
b910: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
b920: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
b930: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
b940: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
b950: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
b960: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
b970: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
b980: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
b990: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
b9a0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
b9b0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
b9c0: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
b9d0: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
b9e0: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
b9f0: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
ba00: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
ba10: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
ba20: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
ba30: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
ba40: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
ba50: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
ba60: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
ba70: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
ba80: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
ba90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
baa0: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
bab0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61  );.  }.  p->pFra
bac0: 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72  me = 0;.  p->nFr
bad0: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
bae0: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
baf0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
bb00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
bb10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
bb20: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
bb30: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
bb40: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
bb50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
bb60: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
bb70: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
bb80: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
bb90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
bba0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
bbb0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
bbc0: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
bbd0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77  ->nMem);.  }.  w
bbe0: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61  hile( p->pDelFra
bbf0: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
bc00: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70  ame *pDel = p->p
bc10: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  DelFrame;.    p-
bc20: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65  >pDelFrame = pDe
bc30: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  l->pParent;.    
bc40: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
bc50: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
bc60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
bc70: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
bc80: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
bc90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
bca0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
bcb0: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
bcc0: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
bcd0: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
bce0: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
bcf0: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
bd00: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
bd10: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
bd20: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
bd30: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
bd40: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
bd50: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
bd60: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
bd70: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
bd80: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
bd90: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
bda0: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
bdb0: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
bdc0: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
bdd0: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
bde0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
bdf0: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
be00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
be10: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
be20: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
be30: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70  p->apCsr==0 || p
be40: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
be50: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70  .  for(i=1; i<=p
be60: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
be70: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20  ert( p->aMem==0 
be80: 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  || p->aMem[i].fl
be90: 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  ags==MEM_Null );
bea0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
beb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
bec0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
bed0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
bee0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
bef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
bf00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
bf10: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
bf20: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
bf30: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
bf40: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
bf50: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
bf60: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
bf70: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
bf80: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
bf90: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
bfa0: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
bfb0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
bfc0: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
bfd0: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
bfe0: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
bff0: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
c000: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
c010: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
c020: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
c030: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
c040: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
c050: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
c060: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
c070: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
c080: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
c090: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
c0a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c0b0: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
c0c0: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
c0d0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
c0e0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
c0f0: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
c100: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
c110: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
c120: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c130: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
c140: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
c150: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
c160: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
c170: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
c180: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
c190: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
c1a0: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
c1b0: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
c1c0: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
c1d0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
c1e0: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
c1f0: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
c200: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
c210: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
c220: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
c230: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
c240: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
c250: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
c260: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
c270: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
c280: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
c290: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
c2a0: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
c2b0: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
c2c0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
c2d0: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
c2e0: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
c2f0: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
c300: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
c310: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
c320: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
c330: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
c340: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
c350: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
c360: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
c370: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
c380: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
c390: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
c3a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
c3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
c3c0: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
c3d0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
c3e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c400: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
c410: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
c420: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
c450: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
c460: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
c470: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
c480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c490: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
c4a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
c4b0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
c4c0: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
c4d0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
c4e0: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
c4f0: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
c500: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
c510: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
c520: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
c530: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
c540: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
c550: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
c560: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
c570: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
c580: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
c590: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
c5a0: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
c5b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c5c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
c5d0: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
c5e0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
c5f0: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
c600: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
c610: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c620: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
c630: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
c640: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
c650: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
c660: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
c670: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
c680: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
c690: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
c6a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
c6b0: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
c6c0: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
c6d0: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
c6e0: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
c6f0: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
c700: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
c710: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
c720: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
c730: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
c740: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
c750: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
c760: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
c770: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
c780: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
c790: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
c7a0: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
c7b0: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
c7c0: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
c7d0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
c7e0: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
c7f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
c800: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
c810: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
c820: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
c830: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c840: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
c850: 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
c860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
c870: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
c880: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
c890: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
c8a0: 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
c8b0: 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
c8c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
c8d0: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
c8e0: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
c8f0: 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
c900: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
c910: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
c920: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
c930: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
c940: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
c950: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
c960: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
c970: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
c980: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
c990: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
c9a0: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
c9b0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c9c0: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
c9d0: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
c9e0: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
c9f0: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
ca00: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
ca10: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
ca20: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
ca30: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
ca40: 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d  nc(db, &p->zErrM
ca50: 73 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  sg);..  /* This 
ca60: 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
ca70: 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
ca80: 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
ca90: 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
caa0: 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
cab0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
cac0: 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
cad0: 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
cae0: 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
caf0: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
cb00: 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
cb10: 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
cb20: 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
cb30: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
cb40: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
cb50: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
cb60: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cb70: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
cb80: 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
cb90: 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
cba0: 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  / .  for(i=0; rc
cbb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
cbc0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
cbd0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
cbe0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
cbf0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
cc00: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
cc10: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65  pBt) ){.      ne
cc20: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
cc30: 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20       if( i!=1 ) 
cc40: 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20  nTrans++;.      
cc50: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
cc60: 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73  rExclusiveLock(s
cc70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
cc80: 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  (pBt));.    }.  
cc90: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
cca0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
ccb0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
ccc0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
ccd0: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
cce0: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
ccf0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
cd00: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
cd10: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
cd20: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
cd30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
cd40: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
cd50: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
cd60: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
cd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
cd80: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
cd90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cda0: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
cdb0: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
cdc0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
cdd0: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
cde0: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
cdf0: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
ce00: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
ce10: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
ce20: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
ce30: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
ce40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
ce50: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
ce60: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
ce70: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
ce80: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
ce90: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
cea0: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
ceb0: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
cec0: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
ced0: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
cee0: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
cef0: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
cf00: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
cf10: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
cf20: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
cf30: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
cf40: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
cf50: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
cf60: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
cf70: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
cf80: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
cf90: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
cfa0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
cfb0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
cfc0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
cfd0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
cfe0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
cff0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d000: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d010: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
d020: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
d030: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
d040: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
d050: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
d060: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
d070: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
d080: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
d090: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
d0a0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
d0b0: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
d0c0: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
d0d0: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
d0e0: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
d0f0: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
d100: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
d110: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
d120: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
d130: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
d140: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d150: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d160: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
d170: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
d180: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
d190: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
d1a0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
d1b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
d1c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
d1d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
d1f0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
d200: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d210: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d220: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d230: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
d240: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
d250: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
d260: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
d270: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
d280: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
d290: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
d2a0: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
d2b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d2c0: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
d2d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
d2e0: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
d2f0: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
d300: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d310: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
d320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
d330: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
d340: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
d350: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
d360: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
d370: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
d380: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
d390: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
d3a0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
d3b0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
d3c0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
d3d0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
d3e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
d3f0: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
d400: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
d410: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a  ;.    int res;..
d420: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
d430: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d440: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
d450: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
d460: 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71  Random;.      sq
d470: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d480: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
d490: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
d4a0: 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
d4b0: 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
d4c0: 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73       zMaster = s
d4d0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d4e0: 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a  , "%s-mj%08X", z
d4f0: 4d 61 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f  MainFile, iRando
d500: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
d510: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
d520: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
d530: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d550: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
d560: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
d570: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
d580: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
d590: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
d5a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
d5b0: 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
d5c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d5d0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
d5e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
d5f0: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
d600: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
d610: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
d620: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
d630: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
d640: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
d650: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
d660: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
d670: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
d680: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
d690: 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
d6a0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
d6b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d6c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
d6d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
d6e0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
d6f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
d700: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
d710: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
d720: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
d730: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
d740: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
d750: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
d760: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
d770: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
d780: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
d790: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
d7a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
d7b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
d7c0: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
d7d0: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
d7e0: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
d7f0: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
d800: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
d810: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
d820: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
d830: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
d840: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
d850: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
d860: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
d870: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
d880: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
d890: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
d8a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
d8b0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
d8c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
d8d0: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
d8e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
d8f0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
d900: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
d910: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
d920: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
d930: 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
d940: 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
d950: 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
d960: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
d970: 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
d980: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
d990: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
d9a0: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
d9b0: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
d9c0: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
d9d0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
d9e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d9f0: 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
da00: 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
da10: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
da20: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
da30: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
da40: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
da50: 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
da60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
da70: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
da80: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
da90: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
daa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
dab0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
dac0: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
dad0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
dae0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
daf0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
db00: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
db10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
db20: 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
db30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
db40: 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
db50: 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
db60: 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
db70: 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
db80: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
db90: 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
dba0: 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  nc .     && 0==(
dbb0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
dbc0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
dbd0: 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
dbe0: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
dbf0: 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
dc00: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
dc10: 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
dc20: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
dc30: 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
dc40: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
dc50: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
dc60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
dc70: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
dc80: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
dc90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
dca0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
dcb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
dcc0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
dcd0: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
dce0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
dcf0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
dd00: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
dd10: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
dd20: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
dd30: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
dd40: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
dd50: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
dd60: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
dd70: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
dd80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
dd90: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
dda0: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
ddb0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
ddc0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
ddd0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
dde0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
ddf0: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
de00: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
de10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
de20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
de30: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
de40: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
de50: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
de60: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
de70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
de80: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
de90: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
dea0: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
deb0: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
dec0: 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
ded0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
dee0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
def0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
df00: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
df10: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
df20: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
df30: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
df40: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
df50: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
df60: 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
df70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
df80: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
df90: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
dfa0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
dfb0: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
dfc0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
dfd0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
dfe0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
dff0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
e000: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
e010: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
e020: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e030: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
e040: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
e050: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
e060: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
e070: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
e080: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
e090: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
e0a0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
e0b0: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
e0c0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
e0d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e0e0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
e0f0: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
e100: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e110: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
e120: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
e130: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
e140: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e150: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
e160: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
e170: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
e180: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
e190: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
e1a0: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
e1b0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e1c0: 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
e1d0: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
e1e0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
e1f0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
e200: 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
e210: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
e220: 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
e230: 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
e240: 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
e250: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
e260: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
e270: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
e280: 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
e290: 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
e2a0: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
e2b0: 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
e2c0: 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
e2d0: 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
e2e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
e2f0: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
e300: 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
e310: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
e320: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
e330: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
e340: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
e350: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
e360: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
e370: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
e380: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
e390: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
e3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e3b0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
e3c0: 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  pBt, 1);.      }
e3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e3e0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
e3f0: 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f  c();.    enable_
e400: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
e410: 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
e420: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
e430: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
e440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e450: 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
e460: 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
e470: 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76  he sqlite3.activ
e480: 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76  eVdbeCnt count v
e490: 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
e4a0: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
e4b0: 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
e4c0: 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
e4d0: 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
e4e0: 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
e4f0: 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
e500: 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
e510: 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
e520: 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
e530: 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
e540: 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
e550: 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
e560: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
e570: 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
e580: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
e590: 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
e5a0: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
e5b0: 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
e5c0: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
e5d0: 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
e5e0: 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
e5f0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
e600: 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
e610: 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
e620: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
e630: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
e640: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
e650: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
e660: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
e670: 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
e680: 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
e690: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
e6a0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
e6b0: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63  ert( cnt==db->ac
e6c0: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 20  tiveVdbeCnt );. 
e6d0: 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
e6e0: 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e  =db->writeVdbeCn
e6f0: 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  t );.}.#else.#de
e700: 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
e710: 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
e720: 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  f../*.** For eve
e730: 72 79 20 42 74 72 65 65 20 74 68 61 74 20 69 6e  ry Btree that in
e740: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e750: 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a  tion db which .*
e760: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
e770: 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69  ied, "trip" or i
e780: 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68 20 63  nvalidate each c
e790: 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74  ursor in.** that
e7a0: 20 42 74 72 65 65 20 6d 69 67 68 74 20 68 61 76   Btree might hav
e7b0: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
e7c0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 75 72 73  so that the curs
e7d0: 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20  or.** can never 
e7e0: 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20  be used again.  
e7f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
e800: 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a  n a rollback.***
e810: 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61 76   occurs.  We hav
e820: 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68  e to trip all th
e830: 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c  e other cursors,
e840: 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20   even.** cursor 
e850: 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69  from other VMs i
e860: 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61  n different data
e870: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
e880: 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e  ,.** so that non
e890: 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f  e of them try to
e8a0: 20 75 73 65 20 74 68 65 20 64 61 74 61 20 61 74   use the data at
e8b0: 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77   which they.** w
e8c0: 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64  ere pointing and
e8d0: 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68   which now may h
e8e0: 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64  ave been changed
e8f0: 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72   due.** to the r
e900: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  ollback..**.** R
e910: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20 72  emember that a r
e920: 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65  ollback can dele
e930: 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65  te tables comple
e940: 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65  te and.** reorde
e950: 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f  r rootpages.  So
e960: 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
e970: 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61  cient just to sa
e980: 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ve.** the state 
e990: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
e9a0: 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c  We have to inval
e9b0: 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  idate the cursor
e9c0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69  .** so that it i
e9d0: 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 67 61  s never used aga
e9e0: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
e9f0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72  id invalidateCur
ea00: 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
ea10: 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  rees(sqlite3 *db
ea20: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
ea30: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
ea40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; i++){.    Btre
ea50: 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69  e *p = db->aDb[i
ea60: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
ea70: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
ea80: 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a  IsInTrans(p) ){.
ea90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
eaa0: 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
eab0: 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  (p, SQLITE_ABORT
eac0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
ead0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
eae0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
eaf0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
eb00: 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
eb10: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
eb20: 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
eb30: 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
eb40: 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
eb50: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
eb60: 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
eb70: 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
eb80: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
eb90: 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
eba0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
ebb0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
ebc0: 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
ebd0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
ebe0: 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
ebf0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
ec00: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74  action is commtt
ec10: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
ec20: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
ec30: 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
ec40: 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
ec50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
ec60: 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
ec70: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
ec80: 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
ec90: 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
eca0: 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
ecb0: 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
ecc0: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
ecd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
ece0: 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
ecf0: 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
ed00: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
ed10: 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
ed20: 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
ed30: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
ed40: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
ed50: 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
ed60: 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
ed70: 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
ed80: 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
ed90: 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e 67 20  ccured, causing 
eda0: 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
edb0: 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74  lback..  ** In t
edc0: 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53  his case (db->nS
edd0: 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e  tatement==0), an
ede0: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  d there is nothi
edf0: 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20  ng to do..  */. 
ee00: 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d   if( db->nStatem
ee10: 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
ee20: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
ee30: 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  i;.    const int
ee40: 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
ee50: 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
ee60: 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d      assert( eOp=
ee70: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
ee80: 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
ee90: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
eea0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
eeb0: 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
eec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
eed0: 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
eee0: 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
eef0: 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
ef00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
ef10: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
ef20: 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
ef30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42  LITE_OK;.      B
ef40: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
ef50: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
ef60: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
ef70: 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
ef80: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
ef90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
efa0: 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
efb0: 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
efc0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
efd0: 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
efe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eff0: 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
f000: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f010: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
f020: 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
f030: 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
f040: 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
f050: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f060: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f070: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f080: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
f090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f0a0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53      }.    db->nS
f0b0: 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  tatement--;.    
f0c0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
f0d0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
f0e0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
f0f0: 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
f100: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
f110: 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
f120: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
f130: 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
f140: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
f150: 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
f160: 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
f170: 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
f180: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
f190: 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
f1a0: 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
f1b0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
f1c0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  {.      db->nDef
f1d0: 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
f1e0: 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
f1f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
f200: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
f210: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
f220: 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
f230: 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
f240: 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
f250: 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
f260: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
f270: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
f280: 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
f290: 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
f2a0: 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
f2b0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
f2c0: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
f2d0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
f2e0: 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
f2f0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
f300: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
f310: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
f320: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
f330: 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
f340: 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
f350: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
f360: 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
f370: 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
f380: 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
f390: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
f3a0: 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65  nd write.** an e
f3b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
f3c0: 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
f3d0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
f3e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f3f0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f400: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f410: 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
f420: 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
f430: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f440: 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
f450: 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44  ferred && db->nD
f460: 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c  eferredCons>0) |
f470: 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
f480: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
f490: 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  >0) ){.    p->rc
f4a0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
f4b0: 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72  AINT;.    p->err
f4c0: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
f4d0: 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
f4e0: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
f4f0: 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65  rrMsg, db, "fore
f500: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
f510: 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
f520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
f530: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
f540: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f550: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
f560: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f570: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
f580: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
f590: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
f5a0: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
f5b0: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
f5c0: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
f5d0: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
f5e0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
f5f0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
f600: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
f610: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
f620: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f630: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
f640: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
f650: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
f660: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
f670: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
f680: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
f690: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
f6a0: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
f6b0: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
f6c0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
f6d0: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
f6e0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
f6f0: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
f700: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
f710: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
f720: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
f730: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
f740: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
f750: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
f760: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
f770: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
f780: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
f790: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
f7a0: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
f7b0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
f7c0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
f7d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
f7f0: 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
f800: 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
f810: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
f820: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
f830: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f840: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
f850: 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
f860: 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
f870: 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
f880: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
f890: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
f8a0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
f8b0: 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
f8c0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
f8d0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f8e0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
f8f0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
f900: 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
f910: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
f920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
f930: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
f940: 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
f950: 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
f960: 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
f970: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
f980: 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
f990: 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
f9a0: 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
f9b0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
f9c0: 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
f9d0: 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
f9e0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
f9f0: 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
fa00: 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
fa10: 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
fa20: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
fa30: 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
fa40: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
fa50: 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
fa60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fa70: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
fa80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fa90: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
faa0: 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
fab0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
fac0: 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
fad0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fae0: 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
faf0: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
fb00: 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
fb10: 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
fb20: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
fb30: 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f  never started */
fb40: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
fb50: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
fb60: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
fb70: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
fb80: 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
fb90: 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
fba0: 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
fbb0: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
fbc0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
fbd0: 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
fbe0: 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
fbf0: 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
fc00: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
fc10: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
fc20: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
fc30: 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
fc40: 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
fc50: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
fc60: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
fc70: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  rc & 0xff;.    a
fc80: 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
fc90: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
fca0: 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65  ED );  /* This e
fcb0: 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65  rror no longer e
fcc0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53  xists */.    isS
fcd0: 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
fce0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
fcf0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
fd00: 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
fd10: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
fd20: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
fd30: 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
fd40: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
fd50: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
fd60: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
fd70: 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
fd80: 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
fd90: 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
fda0: 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
fdb0: 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
fdc0: 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
fdd0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
fde0: 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
fdf0: 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
fe00: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
fe10: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
fe20: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
fe30: 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
fe40: 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
fe50: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
fe60: 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
fe70: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
fe80: 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
fe90: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
fea0: 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
feb0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
fec0: 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
fed0: 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
fee0: 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
fef0: 20 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 69    ** occured whi
ff00: 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  le writing to th
ff10: 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a  e journal, sub-j
ff20: 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61  ournal or databa
ff30: 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
ff40: 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   as part of an e
ff50: 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70  ffort to free up
ff60: 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65   cache space (se
ff70: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  e function.     
ff80: 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28   ** pagerStress(
ff90: 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74  ) in pager.c), t
ffa0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72  he rollback is r
ffb0: 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f  equired to resto
ffc0: 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  re .      ** the
ffd0: 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73   pager to a cons
ffe0: 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
fff0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
10000 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c   !p->readOnly ||
10010 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc!=SQLITE_INT
10020 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ERRUPT ){.      
10030 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49    if( (mrc==SQLI
10040 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
10050 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
10060 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
10070 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nal ){.         
10080 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
10090 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
100a0 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  CK;.        }els
100b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
100c0 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f  We are forced to
100d0 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61   roll back the a
100e0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
100f0 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a  n. Before doing.
10100 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c            ** so,
10110 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72   abort any other
10120 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73   statements this
10130 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c   handle currentl
10140 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20  y has active..  
10150 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10160 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
10170 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
10180 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
10190 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
101a0 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
101b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
101c0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
101d0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
101e0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
101f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10200 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
10210 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65  * Check for imme
10220 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
10230 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f  y violations. */
10240 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
10250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10270 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20  eckFk(p, 0);.   
10280 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
10290 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
102a0 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
102b0 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
102c0 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a   active writer .
102d0 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20      ** VM, then 
102e0 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
102f0 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
10300 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
10310 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
10320 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
10330 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
10340 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
10350 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
10360 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
10370 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
10380 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f  ccurred. .    */
10390 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
103a0 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20  3VtabInSync(db) 
103b0 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74  .     && db->aut
103c0 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26  oCommit .     &&
103d0 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
103e0 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  t==(p->readOnly=
103f0 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
10400 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
10410 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
10420 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
10430 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
10440 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
10450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
10460 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
10470 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
10480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10490 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
104a0 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
104b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
104c0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
104d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
104e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
104f0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
10500 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
10510 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10520 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10530 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
10540 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
10550 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
10560 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
10570 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
10580 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
10590 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
105a0 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
105b0 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
105c0 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
105d0 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
105e0 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
105f0 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
10600 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
10610 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
10620 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
10630 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
10640 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
10650 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
10660 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
10670 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
10680 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
10690 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
106a0 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
106b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
106c0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
106d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
106e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
106f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
10700 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
10710 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10720 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
10730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10740 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
10750 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
10760 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
10770 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
10780 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
10790 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
107a0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
107b0 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
107c0 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
107d0 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
107e0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
107f0 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
10800 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
10810 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
10820 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
10830 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
10840 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
10850 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
10860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10870 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
10880 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
10890 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
108a0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
108b0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
108c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
108d0 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
108e0 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
108f0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
10900 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10910 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
10920 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
10930 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
10940 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
10950 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
10960 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
10970 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
10980 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
10990 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
109a0 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
109b0 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
109c0 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
109d0 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
109e0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
109f0 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
10a00 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
10a10 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
10a20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
10a30 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
10a40 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
10a50 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
10a60 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
10a70 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
10a80 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
10a90 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
10aa0 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
10ab0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
10ac0 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64  e that sqlite3Vd
10ad0 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
10ae0 28 29 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c  () can only fail
10af0 20 69 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   if eStatementOp
10b00 0a 20 20 20 20 2a 2a 20 69 73 20 53 41 56 45 50  .    ** is SAVEP
10b10 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20  OINT_ROLLBACK.  
10b20 42 75 74 20 69 66 20 70 2d 3e 72 63 3d 3d 53 51  But if p->rc==SQ
10b30 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 65 53 74  LITE_OK then eSt
10b40 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a  atementOp.    **
10b50 20 6d 75 73 74 20 62 65 20 53 41 56 45 50 4f 49   must be SAVEPOI
10b60 4e 54 5f 52 45 4c 45 41 53 45 2e 20 20 48 65 6e  NT_RELEASE.  Hen
10b70 63 65 20 74 68 65 20 4e 45 56 45 52 28 70 2d 3e  ce the NEVER(p->
10b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 69  rc==SQLITE_OK) i
10b90 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  n .    ** the fo
10ba0 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 2e 0a 20 20  llowing code..  
10bb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74    */.    if( eSt
10bc0 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20  atementOp ){.   
10bd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
10be0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
10bf0 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f  t(p, eStatementO
10c00 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
10c10 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
10c20 72 74 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  rt( eStatementOp
10c30 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
10c40 42 41 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  BACK );.        
10c50 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d  if( NEVER(p->rc=
10c60 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20 70  =SQLITE_OK) || p
10c70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->rc==SQLITE_CON
10c80 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
10c90 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
10ca0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10cb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
10cc0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
10cd0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
10ce0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
10cf0 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
10d00 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
10d10 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
10d20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
10d30 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
10d40 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
10d50 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
10d60 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
10d70 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
10d80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
10d90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
10da0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
10db0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
10dc0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
10dd0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
10de0 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
10df0 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
10e00 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
10e10 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
10e20 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
10e30 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
10e40 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
10e50 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
10e60 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10e70 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
10e80 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
10e90 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
10ea0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
10eb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ec0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
10ed0 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
10ee0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
10ef0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
10f00 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f     /* Rollback o
10f10 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68  r commit any sch
10f20 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74  ema changes that
10f30 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20   occurred. */.  
10f40 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
10f50 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c  ITE_OK && db->fl
10f60 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
10f70 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
10f80 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
10f90 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
10fa0 20 2d 31 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e   -1);.      db->
10fb0 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
10fc0 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
10fd0 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
10fe0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
10ff0 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
11000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
11010 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
11020 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
11030 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
11040 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
11050 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
11060 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
11070 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
11080 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
11090 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
110a0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
110b0 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
110c0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  --;.    }.    as
110d0 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
110e0 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69  VdbeCnt>=db->wri
110f0 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d  teVdbeCnt );.  }
11100 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
11110 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
11120 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
11130 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
11140 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
11150 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
11160 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11170 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
11180 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
11190 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
111a0 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
111b0 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
111c0 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
111d0 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
111e0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
111f0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
11200 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
11210 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
11220 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
11230 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
11240 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
11250 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
11260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
11270 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
11280 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
11290 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
112a0 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61  beCnt>0 || db->a
112b0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
112c0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
112d0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
112e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
112f0 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
11300 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
11310 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
11320 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
11330 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
11340 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
11350 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
11360 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
11370 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
11380 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
11390 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
113a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
113b0 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
113c0 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
113d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
113e0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
113f0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
11400 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
11410 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
11420 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
11430 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
11440 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
11450 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
11460 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
11470 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
11480 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
11490 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
114a0 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
114b0 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
114c0 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
114d0 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
114e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
114f0 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
11500 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
11510 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
11520 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
11530 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
11540 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
11550 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
11560 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
11570 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
11580 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
11590 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
115a0 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
115b0 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
115c0 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
115d0 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
115e0 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
115f0 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
11600 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
11610 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
11620 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
11630 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
11640 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
11650 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
11660 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
11670 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
11680 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
11690 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
116a0 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
116b0 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
116c0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
116d0 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
116e0 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
116f0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
11700 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
11710 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
11720 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
11730 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
11740 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
11750 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
11760 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
11770 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
11780 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
11790 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
117a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
117b0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
117c0 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
117d0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
117e0 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72  ->pErr,-1,p->zEr
117f0 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38  rMsg,SQLITE_UTF8
11800 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
11810 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
11820 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
11830 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72  ();.      db->er
11840 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20  rCode = p->rc;. 
11850 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11860 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
11870 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  g);.      p->zEr
11880 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
11890 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
118a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
118b0 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
118c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
118d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
118e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
118f0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
11900 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65  ( p->runOnlyOnce
11910 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20   ) p->expired = 
11920 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
11930 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72  ->rc && p->expir
11940 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
11950 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61   expired flag wa
11960 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42  s set on the VDB
11970 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  E before the fir
11980 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  st call.    ** t
11990 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
119a0 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  . For consistenc
119b0 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33  y (since sqlite3
119c0 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20  _step() was.    
119d0 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20  ** called), set 
119e0 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72  the database err
119f0 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  or in this case 
11a00 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  as well..    */.
11a10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11a20 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  (db, p->rc, 0);.
11a30 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11a40 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
11a50 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
11a60 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
11a70 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
11a80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
11a90 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
11aa0 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
11ab0 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
11ac0 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
11ad0 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
11ae0 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
11af0 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
11b00 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
11b10 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
11b20 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
11b30 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
11b40 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
11b50 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
11b60 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
11b70 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
11b80 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
11b90 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
11ba0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
11bb0 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
11bc0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
11bd0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
11be0 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
11bf0 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
11c00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11c10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
11c20 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  n");.      for(i
11c30 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
11c40 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
11c50 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31  ntf(out, "%6d %1
11c60 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20  0lld %8lld ",.  
11c70 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
11c80 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
11c90 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
11ca0 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
11cb0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
11cc0 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
11cd0 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
11ce0 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
11cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11d00 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
11d10 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
11d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
11d30 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
11d40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
11d50 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
11d60 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
11d70 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
11d80 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
11d90 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
11da0 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
11db0 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
11dc0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
11dd0 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
11de0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
11df0 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
11e00 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
11e10 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
11e20 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
11e30 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
11e40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11e50 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
11e60 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
11e70 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
11e80 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
11e90 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
11ea0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
11eb0 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
11ec0 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
11ed0 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
11ee0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
11ef0 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
11f00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
11f10 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74  all the destruct
11f20 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64  or for each auxd
11f30 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64  ata entry in pVd
11f40 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68  beFunc for which
11f50 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
11f60 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73  nding bit in mas
11f70 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78  k is clear.  Aux
11f80 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79  data entries bey
11f90 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c  ond 31.** are al
11fa0 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20  ways destroyed. 
11fb0 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20   To destroy all 
11fc0 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c  auxdata entries,
11fd0 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f   call this.** ro
11fe0 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d  utine with mask=
11ff0 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  =0..*/.void sqli
12000 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
12010 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70  Data(VdbeFunc *p
12020 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61  VdbeFunc, int ma
12030 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sk){.  int i;.  
12040 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65  for(i=0; i<pVdbe
12050 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29  Func->nAux; i++)
12060 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78  {.    struct Aux
12070 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56  Data *pAux = &pV
12080 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69  dbeFunc->apAux[i
12090 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31  ];.    if( (i>31
120a0 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75 33   || !(mask&(((u3
120b0 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70 41  2)1)<<i))) && pA
120c0 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20  ux->pAux ){.    
120d0 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
120e0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
120f0 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
12100 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
12110 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41  }.      pAux->pA
12120 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
12130 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
12140 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
12150 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
12160 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
12170 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12180 74 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  t..** The differ
12190 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
121a0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
121b0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
121c0 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
121d0 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
121e0 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
121f0 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
12200 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
12210 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
12220 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12230 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12240 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63  3VdbeDeleteObjec
12250 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
12260 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
12270 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
12280 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ext;.  assert( p
12290 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
122a0 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
122b0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
122c0 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
122d0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
122e0 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
122f0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
12300 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
12310 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
12320 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
12330 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
12340 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
12350 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
12360 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
12370 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
12380 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12390 53 75 62 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65  Sub);.  }.  vdbe
123a0 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
123b0 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
123c0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
123d0 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b  (db, p->aLabel);
123e0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
123f0 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
12400 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
12410 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
12420 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12430 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
12440 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12450 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
12460 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
12470 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
12480 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12490 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
124a0 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
124b0 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
124c0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
124d0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ->db;.  if( p->p
124e0 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
124f0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
12500 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
12510 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12520 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
12530 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
12540 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
12550 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
12560 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
12570 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
12580 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
12590 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
125a0 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
125b0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f  lite3VdbeDeleteO
125c0 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a  bject(db, p);.}.
125d0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
125e0 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
125f0 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
12600 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
12610 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
12620 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
12630 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
12640 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
12650 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
12660 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
12670 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
12680 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
12690 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
126a0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
126b0 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
126c0 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
126d0 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
126e0 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
126f0 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
12700 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
12710 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
12720 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
12730 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
12740 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
12750 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
12760 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
12770 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
12780 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
12790 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
127a0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
127b0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
127c0 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
127d0 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
127e0 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
127f0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
12800 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
12810 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12820 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
12830 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
12840 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
12850 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
12860 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
12870 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72  {.    int res, r
12880 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
12890 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e  _TEST.    extern
128a0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
128b0 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
128c0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
128d0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
128e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
128f0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
12900 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
12910 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
12920 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
12930 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12940 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77  ;.    p->lastRow
12950 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  id = p->movetoTa
12960 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65  rget;.    if( re
12970 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  s!=0 ) return SQ
12980 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12990 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  T;.    p->rowidI
129a0 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64  sValid = 1;.#ifd
129b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
129c0 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
129d0 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
129e0 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65  f.    p->deferre
129f0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
12a00 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
12a10 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
12a20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
12a30 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  S(p->pCursor) ){
12a40 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65  .    int hasMove
12a50 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
12a60 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
12a70 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
12a80 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64  ursor, &hasMoved
12a90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
12aa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
12ab0 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20  f( hasMoved ){. 
12ac0 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61       p->cacheSta
12ad0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
12ae0 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c  E;.      p->null
12af0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Row = 1;.    }. 
12b00 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12b10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12b20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
12b30 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
12b40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
12b50 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
12b60 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
12b70 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
12b80 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
12b90 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
12ba0 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
12bb0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
12bc0 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
12bd0 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
12be0 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
12bf0 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
12c00 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
12c10 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
12c20 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
12c30 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
12c40 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
12c50 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
12c60 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
12c70 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
12c80 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
12c90 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
12ca0 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
12cb0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
12cc0 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
12cd0 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
12ce0 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
12cf0 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
12d00 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
12d10 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
12d20 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
12d30 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
12d40 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
12d50 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
12d60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
12d70 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
12d80 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
12d90 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
12da0 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
12db0 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
12dc0 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
12dd0 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
12de0 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
12df0 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
12e00 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
12e10 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
12e20 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
12e30 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
12e40 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
12e50 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
12e60 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
12e70 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
12e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
12e90 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
12ea0 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
12eb0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
12ee0 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
12f10 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
12f20 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
12f30 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
12f40 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
12f50 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
12f60 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
12f70 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
12f80 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
12f90 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
12fc0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
12fd0 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
12fe0 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
12ff0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
13000 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13020 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
13030 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13040 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
13060 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
13070 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
130a0 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
130b0 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
130e0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
130f0 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13120 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
13130 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
13140 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
13150 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
13160 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
13170 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
13180 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
13190 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
131a0 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
131b0 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
131c0 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
131d0 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
131e0 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
131f0 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
13200 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
13210 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
13220 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
13230 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
13240 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
13250 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
13260 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
13270 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
13280 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
13290 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
132a0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
132b0 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
132c0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
132d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
132e0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
132f0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
13300 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
13310 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
13320 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
13330 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
13340 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
13350 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
13360 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
13370 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
13380 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
13390 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
133a0 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
133b0 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a  eturn 8+(u32)i;.
133c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
133d0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
133e0 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20  <(-MAX_6BYTE) ) 
133f0 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20  return 6;.      
13400 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74  /* Previous test
13410 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20   prevents:  u = 
13420 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  -(-9223372036854
13430 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20  775808) */.     
13440 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c   u = -i;.    }el
13450 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b  se{.      u = i;
13460 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
13470 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
13480 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
13490 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
134a0 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
134b0 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
134c0 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
134d0 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
134e0 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
134f0 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
13500 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
13510 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
13520 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
13530 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
13540 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
13550 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
13560 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
13570 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
13580 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
13590 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
135a0 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
135b0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
135c0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
135d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
135e0 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
135f0 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
13600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13610 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
13620 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
13630 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
13640 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
13650 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
13660 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13670 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
13680 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
13690 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
136a0 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
136b0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
136c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
136d0 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
136e0 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
136f0 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
13700 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
13710 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
13720 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
13730 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
13740 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
13750 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
13760 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
13770 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
13780 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
13790 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
137a0 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
137b0 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
137c0 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
137d0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
137e0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
137f0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
13800 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
13810 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
13820 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
13830 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
13840 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
13850 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
13860 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
13870 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
13880 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
13890 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
138a0 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
138b0 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
138c0 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
138d0 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
138e0 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
138f0 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
13900 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
13910 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
13920 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
13930 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
13940 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
13950 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
13960 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
13970 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
13980 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
13990 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
139a0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
139b0 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
139c0 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
139d0 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
139e0 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
139f0 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
13a00 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
13a10 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
13a20 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
13a30 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
13a40 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
13a50 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
13a60 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
13a70 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
13a80 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
13a90 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
13aa0 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
13ab0 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
13ac0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
13ad0 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
13ae0 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
13af0 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
13b00 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
13b10 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
13b20 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
13b30 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
13b40 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
13b50 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
13b60 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
13b70 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
13b80 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
13b90 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
13ba0 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
13bb0 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
13bc0 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
13bd0 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
13be0 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
13bf0 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
13c00 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
13c10 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
13c20 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
13c30 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
13c40 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
13c50 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
13c60 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
13c70 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
13c80 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
13c90 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
13ca0 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
13cb0 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
13cc0 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
13cd0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
13ce0 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
13cf0 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
13d00 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
13d10 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
13d20 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
13d30 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
13d40 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
13d50 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
13d60 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
13d70 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
13d80 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
13d90 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
13da0 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
13db0 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
13dc0 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
13dd0 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
13de0 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
13df0 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
13e00 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
13e10 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
13e20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
13e30 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
13e40 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
13e50 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
13e60 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
13e70 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
13e80 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
13e90 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
13ea0 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
13eb0 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
13ec0 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
13ed0 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
13ee0 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
13ef0 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
13f00 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
13f10 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
13f20 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
13f30 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
13f40 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
13f50 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
13f60 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
13f70 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
13f80 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
13f90 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
13fa0 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
13fb0 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
13fc0 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20  in buf[].  nBuf 
13fd0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a  must always be.*
13fe0 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
13ff0 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
14000 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74  e field.  Except
14010 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69  , if the field i
14020 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68  s.** a blob with
14030 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74   a zero-filled t
14040 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20  ail, then buf[] 
14050 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68  might be just th
14060 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20  e right.** size 
14070 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69  to hold everythi
14080 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ng except for th
14090 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
140a0 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a  il.  If buf[].**
140b0 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f   is only big eno
140c0 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
140d0 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c  non-zero prefix,
140e0 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
140f0 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20   that.** prefix 
14100 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74  into buf[].  But
14110 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72   if buf[] is lar
14120 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
14130 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72  d both the.** pr
14140 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69  efix and the tai
14150 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  l then write the
14160 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20   prefix and set 
14170 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a  the tail to all.
14180 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20  ** zeros..**.** 
14190 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
141a0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
141b0 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
141c0 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
141d0 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
141e0 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
141f0 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
14200 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
14210 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
14220 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
14230 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
14240 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
14250 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
14260 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e  t(u8 *buf, int n
14270 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Buf, Mem *pMem, 
14280 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
14290 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  {.  u32 serial_t
142a0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
142b0 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d  eSerialType(pMem
142c0 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
142d0 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
142e0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
142f0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
14300 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
14310 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
14320 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
14330 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
14340 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
14350 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14360 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
14370 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
14380 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
14390 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
143a0 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
143b0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
143c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
143d0 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
143e0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
143f0 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
14400 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
14410 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
14420 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32  ssert( len<=(u32
14430 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  )nBuf );.    whi
14440 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
14450 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76   buf[i] = (u8)(v
14460 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
14470 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
14480 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
14490 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
144a0 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
144b0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
144c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
144d0 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
144e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
144f0 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
14500 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
14510 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
14520 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
14530 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
14540 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
14550 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
14560 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
14570 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
14580 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
14590 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
145a0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
145b0 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
145c0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
145d0 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
145e0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
145f0 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66   len > (u32)nBuf
14600 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
14610 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20  = (u32)nBuf;.   
14620 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
14630 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
14640 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
14650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14660 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
14670 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
14680 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
14690 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
146a0 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
146b0 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
146c0 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
146d0 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
146e0 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
146f0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
14700 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
14710 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
14720 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
14730 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
14740 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
14750 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14760 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
14770 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
14780 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
14790 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
147a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
147b0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
147c0 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
147d0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
147f0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
14800 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
14810 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
14820 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
14830 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
14840 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
14850 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
14860 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
14870 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
14880 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
14890 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
148a0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
148b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
148c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
148d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
148e0 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
148f0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
14900 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
14910 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
14920 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
14930 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
14940 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
14950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14960 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
14970 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
14980 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
14990 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
149a0 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
149b0 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
149c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
149d0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
149e0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
149f0 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
14a00 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
14a10 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
14a20 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
14a30 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
14a40 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
14a50 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
14a60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14a70 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
14a80 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
14a90 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
14aa0 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
14ab0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
14ac0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
14ad0 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
14ae0 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
14af0 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
14b00 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
14b10 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
14b20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
14b30 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
14b40 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
14b50 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
14b60 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
14b70 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
14b80 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
14b90 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
14ba0 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
14bb0 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
14bc0 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
14bd0 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
14be0 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
14bf0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
14c00 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
14c10 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
14c20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
14c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14c40 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
14c50 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
14c60 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
14c70 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
14c80 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
14c90 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
14ca0 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
14cb0 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
14cc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14cd0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
14ce0 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
14cf0 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
14d00 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
14d10 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
14d20 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
14d30 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
14d40 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
14d50 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
14d60 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
14d70 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
14d80 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
14d90 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
14da0 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
14db0 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
14dc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14dd0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
14de0 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
14df0 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
14e00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
14e10 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
14e20 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
14e30 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
14e40 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
14e50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14e60 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
14e70 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
14e80 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
14e90 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
14ea0 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
14eb0 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
14ec0 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
14ed0 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
14ee0 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
14ef0 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
14f00 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
14f10 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
14f20 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
14f30 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
14f40 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
14f50 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
14f60 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
14f70 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
14f80 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14f90 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14fa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14fb0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
14fc0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
14fd0 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
14fe0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14ff0 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
15000 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
15010 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
15020 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
15030 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
15040 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45  aN(pMem->r) ? ME
15050 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
15060 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
15070 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
15080 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
15090 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
150a0 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
150b0 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
150c0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
150d0 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
150e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
150f0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
15100 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
15110 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
15120 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  {.      u32 len 
15130 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
15140 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
15150 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
15160 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
15170 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
15180 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
15190 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
151a0 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
151b0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
151c0 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
151d0 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
151e0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
151f0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
15200 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
15210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
15220 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
15230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
15240 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  }.../*.** Given 
15250 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
15260 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
15270 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61  rd in pKey[], pa
15280 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  rse the.** recor
15290 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65  d into a Unpacke
152a0 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
152b0 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
152c0 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
152d0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
152e0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
152f0 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76  ction might prov
15300 69 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65  ide szSpace byte
15310 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  s of memory.** s
15320 70 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20  pace at pSpace. 
15330 20 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20   This space can 
15340 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  be used to hold 
15350 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
15360 56 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64  VDbeParsedRecord
15370 20 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74   structure if it
15380 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
15390 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e  .  If it is.** n
153a0 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73  ot big enough, s
153b0 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64  pace is obtained
153c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
153d0 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lloc()..**.** Th
153e0 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63  e returned struc
153f0 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63  ture should be c
15400 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20  losed by a call 
15410 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  to.** sqlite3Vdb
15420 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
15430 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70  ecord()..*/ .Unp
15440 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
15450 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
15460 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
15470 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
15480 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
15490 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
154a0 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
154b0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
154c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
154d0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
154e0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
154f0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
15500 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
15510 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
15520 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  e,          /* U
15530 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
15540 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64  vailable to hold
15550 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
15560 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20   int szSpace    
15570 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
15580 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
15590 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ytes */.){.  con
155a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
155b0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
155c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
155d0 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  pKey;.  Unpacked
155e0 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54  Record *p;  /* T
155f0 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
15600 72 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  rd that we will 
15610 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
15620 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
15630 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
15640 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70  needed to hold p
15650 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  , in bytes */.  
15660 69 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78  int d;.  u32 idx
15670 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  ;.  u16 u;      
15680 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
15690 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
156a0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
156b0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
156c0 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
156d0 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
156e0 70 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d  pSpace by this m
156f0 75 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c  uch to 8-byte al
15700 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f  ign it */.  .  /
15710 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74  *.  ** We want t
15720 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e  o shift the poin
15730 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75  ter pSpace up su
15740 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d  ch that it is 8-
15750 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20  byte aligned..  
15760 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64  ** Thus, we need
15770 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20   to calculate a 
15780 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74  value, nOff, bet
15790 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f  ween 0 and 7, to
157a0 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20   shift .  ** it 
157b0 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69  by.  If pSpace i
157c0 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65  s already 8-byte
157d0 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73   aligned, nOff s
157e0 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20  hould be zero.. 
157f0 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20   */.  nOff = (8 
15800 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  - (SQLITE_PTR_TO
15810 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37  _INT(pSpace) & 7
15820 29 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65  )) & 7;.  pSpace
15830 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70   += nOff;.  szSp
15840 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e  ace -= nOff;.  n
15850 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
15860 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
15870 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
15880 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
15890 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20  Field+1);.  if( 
158a0 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b  nByte>szSpace ){
158b0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
158c0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
158d0 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
158e0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
158f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
15900 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
15910 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55  ED_NEED_FREE | U
15920 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
15930 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TROY;.  }else{. 
15940 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
15950 52 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a  Record*)pSpace;.
15960 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
15970 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
15980 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  TROY;.  }.  p->p
15990 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
159a0 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
159b0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
159c0 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65  ld + 1;.  p->aMe
159d0 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a  m = pMem = (Mem*
159e0 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
159f0 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
15a00 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
15a10 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
15a20 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
15a30 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
15a40 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
15a50 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
15a60 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
15a70 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
15a80 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
15a90 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
15aa0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
15ab0 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
15ac0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
15ad0 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
15ae0 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
15af0 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
15b00 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
15b10 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
15b20 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
15b30 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
15b40 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
15b50 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
15b60 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
15b70 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
15b80 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
15b90 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20  m++;.    u++;.  
15ba0 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
15bb0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
15bc0 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
15bd0 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e  ld = u;.  return
15be0 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a   (void*)p;.}../*
15bf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15c00 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61   destroys a Unpa
15c10 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63  ckedRecord objec
15c20 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
15c30 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
15c40 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63  ckedRecord(Unpac
15c50 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
15c60 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70   int i;.  Mem *p
15c70 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
15c80 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
15c90 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ( p->flags & UNP
15ca0 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
15cb0 4f 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  OY );.  for(i=0,
15cc0 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69   pMem=p->aMem; i
15cd0 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c  <p->nField; i++,
15ce0 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pMem++){.    /*
15cf0 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   The unpacked re
15d00 63 6f 72 64 20 69 73 20 61 6c 77 61 79 73 20 63  cord is always c
15d10 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
15d20 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
15d30 56 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64  VdbeUnpackRecord
15d40 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  () function abov
15d50 65 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61  e, which makes a
15d60 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ll.    ** string
15d70 73 20 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74  s and blobs stat
15d80 69 63 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  ic.  And none of
15d90 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72   the elements ar
15da0 65 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72  e.    ** ever tr
15db0 61 6e 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68  ansformed, so th
15dc0 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
15dd0 74 68 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e  thing to delete.
15de0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15df0 4e 45 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c  NEVER(pMem->zMal
15e00 6c 6f 63 29 20 29 20 73 71 6c 69 74 65 33 56 64  loc) ) sqlite3Vd
15e10 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
15e20 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  m);.  }.  if( p-
15e30 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
15e40 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20  D_NEED_FREE ){. 
15e50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15e60 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  (p->pKeyInfo->db
15e70 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
15e80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15e90 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
15ea0 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
15eb0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
15ec0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
15ed0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
15ee0 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
15ef0 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
15f00 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
15f10 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
15f20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
15f30 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
15f40 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
15f50 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
15f60 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
15f70 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
15f80 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50  created by th OP
15f90 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
15fa0 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
15fb0 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
15fc0 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
15fd0 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
15fe0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
15ff0 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
16000 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b  eRecord..**.** K
16010 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
16020 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
16030 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
16040 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a  ber of fields..*
16050 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66  * The key with f
16060 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75  ewer fields is u
16070 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20  sually compares 
16080 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a  less than the .*
16090 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48  * longer key.  H
160a0 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e  owever if the UN
160b0 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66  PACKED_INCRKEY f
160c0 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69  lags in pPKey2 i
160d0 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65  s set.** and the
160e0 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
160f0 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
16100 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
16110 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69  an key2..** Or i
16120 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d  f the UNPACKED_M
16130 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67  ATCH_PREFIX flag
16140 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
16150 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20  prefixes are.** 
16160 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20  equal, then the 
16170 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65  keys are conside
16180 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20  red to be equal 
16190 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73  and.** the parts
161a0 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d   beyond the comm
161b0 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67  on prefix are ig
161c0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
161d0 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  the UNPACKED_IGN
161e0 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69  ORE_ROWID flag i
161f0 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
16200 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20  last byte of.** 
16210 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b  the header of pK
16220 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ey1 is ignored. 
16230 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
16240 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20  hat pKey1 is.** 
16250 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e  an index key, an
16260 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74 68  d thus ends with
16270 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20   a rowid value. 
16280 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a   The last byte.*
16290 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  * of the header 
162a0 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62  will therefore b
162b0 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  e the serial typ
162c0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a  e of the rowid:.
162d0 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20  ** one of 1, 2, 
162e0 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f  3, 4, 5, 6, 8, o
162f0 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65  r 9 - the intege
16300 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  r serial types..
16310 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  ** The serial ty
16320 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20  pe of the final 
16330 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79  rowid will alway
16340 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79  s be a single by
16350 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69  te..** By ignori
16360 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79 74  ng this last byt
16370 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c  e of the header,
16380 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f   we force the co
16390 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69  mparison.** to i
163a0 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20  gnore the rowid 
163b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65  at the end of ke
163c0 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y1..*/.int sqlit
163d0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
163e0 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
163f0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
16400 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
16410 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
16420 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
16430 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
16440 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b   */.){.  int d1;
16450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16460 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
16470 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
16480 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
16490 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f  idx1;          /
164a0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
164b0 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
164c0 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
164d0 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
164e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
164f0 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
16500 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
16510 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
16520 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
16530 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
16540 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
16550 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16560 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
16570 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
16580 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
16590 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
165a0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d  >pKeyInfo;.  mem
165b0 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
165c0 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
165d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
165e0 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
165f0 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
16600 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
16610 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16620 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
16630 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c  _ONLY( mem1.zMal
16640 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
16650 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
16660 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
16670 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
16680 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
16690 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
166a0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
166b0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
166c0 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
166d0 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
166e0 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
166f0 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
16700 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
16710 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
16720 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
16730 61 6c 6c 79 20 62 65 20 75 73 65 64 20 69 6e 69  ally be used ini
16740 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
16750 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
16760 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
16770 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
16780 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
16790 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
167a0 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
167b0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
167c0 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
167d0 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
167e0 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
167f0 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
16800 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
16810 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
16820 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
16830 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
16840 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
16850 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
16860 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
16870 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
16880 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
16890 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
168a0 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
168b0 20 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70   szHdr1;.  if( p
168c0 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
168d0 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
168e0 4f 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64  OWID ){.    szHd
168f0 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65  r1--;.  }.  nFie
16900 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
16910 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
16920 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
16930 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
16940 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
16950 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
16960 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
16970 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
16980 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
16990 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
169a0 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
169b0 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
169c0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
169d0 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
169e0 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
169f0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
16a00 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
16a10 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
16a20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
16a30 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
16a40 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
16a50 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
16a60 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
16a70 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
16a80 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
16a90 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
16aa0 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
16ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
16ac0 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
16ad0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a  PKey2->aMem[i],.
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69             i<nFi
16b00 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld ? pKeyInfo->
16b10 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20  aColl[i] : 0);. 
16b20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
16b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
16b40 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
16b50 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
16b60 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20   below */..     
16b70 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
16b80 65 73 75 6c 74 20 69 66 20 77 65 20 61 72 65 20  esult if we are 
16b90 75 73 69 6e 67 20 44 45 53 43 20 73 6f 72 74 20  using DESC sort 
16ba0 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
16bb0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
16bc0 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 6e 46  ortOrder && i<nF
16bd0 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f  ield && pKeyInfo
16be0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
16bf0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16c00 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
16c10 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
16c20 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20  e PREFIX_SEARCH 
16c30 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
16c40 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70  all fields excep
16c50 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20  t the final.    
16c60 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64    ** rowid field
16c70 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65   were equal, the
16c80 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46  n clear the PREF
16c90 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61  IX_SEARCH flag a
16ca0 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a  nd set .      **
16cb0 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74   pPKey2->rowid t
16cc0 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
16cd0 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69  he rowid field i
16ce0 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29  n (pKey1, nKey1)
16cf0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
16d00 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f  is used by the O
16d10 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64  P_IsUnique opcod
16d20 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
16d30 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66    if( (pPKey2->f
16d40 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
16d50 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26  PREFIX_SEARCH) &
16d60 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46  & i==(pPKey2->nF
16d70 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20  ield-1) ){.     
16d80 20 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d     assert( idx1=
16d90 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b  =szHdr1 && rc );
16da0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16db0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45   mem1.flags & ME
16dc0 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
16dd0 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
16de0 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46  = ~UNPACKED_PREF
16df0 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20  IX_SEARCH;.     
16e00 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64     pPKey2->rowid
16e10 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20   = mem1.u.i;.   
16e20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20     }.    .      
16e30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16e40 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
16e50 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
16e60 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
16e70 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
16e80 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
16e90 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
16ea0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
16eb0 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
16ec0 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
16ed0 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
16ee0 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
16ef0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
16f00 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
16f10 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
16f20 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
16f30 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
16f40 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
16f50 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
16f60 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
16f70 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
16f80 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
16f90 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
16fa0 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
16fb0 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
16fc0 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73  KEY.  ** flag is
16fd0 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b   set, then break
16fe0 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61   the tie by trea
16ff0 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72  ting key2 as lar
17000 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ger..  ** If the
17010 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f   UPACKED_PREFIX_
17020 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65  MATCH flag is se
17030 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74  t, then keys wit
17040 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  h common prefixe
17050 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69  s.  ** are consi
17060 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
17070 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  l.  Otherwise, t
17080 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73  he longer key is
17090 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65   the .  ** large
170a0 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e  r.  As it happen
170b0 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69  s, the pPKey2 wi
170c0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ll always be the
170d0 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20   longer.  ** if 
170e0 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65  there is a diffe
170f0 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  rence..  */.  as
17100 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
17110 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
17120 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs & UNPACKED_IN
17130 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20  CRKEY ){.    rc 
17140 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = -1;.  }else if
17150 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
17160 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
17170 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f  X_MATCH ){.    /
17180 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f  * Leave rc==0 */
17190 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78  .  }else if( idx
171a0 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20  1<szHdr1 ){.    
171b0 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  rc = 1;.  }.  re
171c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a  turn rc;.}. ../*
171d0 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
171e0 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
171f0 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
17200 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
17210 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
17220 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
17230 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
17240 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
17250 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
17260 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
17270 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
17280 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
17290 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
172a0 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
172b0 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
172c0 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
172d0 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
172e0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
172f0 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
17300 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
17310 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
17320 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
17330 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
17340 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17350 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
17360 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
17370 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
17380 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
17390 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
173a0 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
173b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
173c0 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
173d0 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
173e0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
173f0 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
17400 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
17410 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
17420 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
17430 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e   Mem m, v;..  UN
17440 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
17450 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  b);..  /* Get th
17460 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
17470 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
17480 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
17490 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
174a0 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
174b0 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
174c0 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
174d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
174e0 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
174f0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
17500 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
17510 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
17520 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
17530 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
17540 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
17550 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
17560 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
17570 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
17580 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
17590 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
175a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
175b0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
175c0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
175d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
175e0 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
175f0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
17600 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
17610 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
17620 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
17630 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
17640 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
17650 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
17660 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
17670 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
17680 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  entry */.  memse
17690 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
176a0 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  m));.  rc = sqli
176b0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
176c0 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e  ree(pCur, 0, (in
176d0 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
176e0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
176f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17700 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
17710 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
17720 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
17730 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
17740 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
17750 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
17760 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
17770 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
17780 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
17790 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
177a0 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
177b0 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
177c0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
177d0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
177e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
177f0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
17800 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
17810 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
17820 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
17830 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
17840 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
17850 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
17860 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
17870 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
17880 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
17890 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
178a0 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
178b0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
178c0 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
178d0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
178e0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
178f0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
17900 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
17910 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
17920 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17930 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
17940 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
17950 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
17960 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
17970 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17980 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
17990 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
179a0 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
179b0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
179c0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
179d0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
179e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
179f0 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
17a00 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
17a10 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
17a20 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
17a30 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
17a40 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
17a50 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
17a60 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
17a70 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
17a80 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
17a90 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
17aa0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
17ab0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
17ac0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
17ad0 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
17ae0 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
17af0 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
17b00 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
17b10 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
17b20 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
17b30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
17b40 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
17b50 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
17b60 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
17b70 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
17b80 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
17b90 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
17ba0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
17bb0 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
17bc0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17bd0 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
17be0 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b   m.zMalloc!=0 );
17bf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
17c00 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
17c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17c20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
17c30 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
17c40 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
17c50 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
17c60 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
17c70 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
17c80 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
17c90 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
17ca0 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
17cb0 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
17cc0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
17cd0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
17ce0 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
17cf0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
17d00 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
17d10 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
17d20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
17d30 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
17d40 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
17d50 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
17d60 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
17d70 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
17d80 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
17d90 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
17da0 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
17db0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
17dc0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
17dd0 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
17de0 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
17df0 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
17e00 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
17e10 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
17e20 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
17e30 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
17e40 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
17e50 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
17e60 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
17e70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f  are(.  VdbeCurso
17e80 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
17e90 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
17ea0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
17eb0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
17ec0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
17ed0 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  ed,  /* Unpacked
17ee0 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
17ef0 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
17f00 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  st */.  int *res
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17f30 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
17f40 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
17f50 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
17f60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
17f70 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
17f80 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
17f90 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
17fa0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17fb0 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
17fc0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17fd0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
17fe0 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
17ff0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
18000 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
18010 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
18020 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
18030 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
18040 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
18050 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
18060 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
18070 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
18080 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68   the say.  ** th
18090 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
180a0 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
180b0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
180c0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
180d0 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
180e0 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
180f0 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
18100 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
18110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18120 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
18130 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
18140 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72   sizeof(m));.  r
18150 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
18160 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
18170 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74  pCursor, 0, (int
18180 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
18190 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
181a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
181b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70  }.  assert( pUnp
181c0 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55  acked->flags & U
181d0 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
181e0 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d  OWID );.  *res =
181f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18200 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
18210 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
18220 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18230 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
18240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18260 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
18270 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
18280 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
18290 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
182a0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
182b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
182c0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
182d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
182e0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
182f0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
18300 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
18310 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18320 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
18330 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
18340 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
18350 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
18360 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
18370 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
18380 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
18390 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
183a0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
183b0 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
183c0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
183d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
183e0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
183f0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
18400 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
18410 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
18420 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18430 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18440 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
18450 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
18460 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
18470 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
18480 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
18490 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
184a0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
184b0 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
184c0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
184d0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
184e0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
184f0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
18500 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
18510 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
18520 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
18530 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
18540 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
18550 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
18560 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
18570 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
18580 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
18590 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
185a0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
185b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
185c0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
185d0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
185e0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
185f0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
18600 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
18610 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
18620 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
18630 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
18640 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
18650 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
18660 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
18670 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
18680 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
18690 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
186a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
186b0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
186c0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
186d0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
186e0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
186f0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
18700 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
18710 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
18720 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
18730 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
18740 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
18750 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
18760 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
18770 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
18780 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
18790 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
187a0 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
187b0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
187c0 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
187d0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
187e0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
187f0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
18800 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
18810 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
18820 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
18830 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
18840 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
18850 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
18860 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
18870 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
18880 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
18890 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
188a0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
188b0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
188c0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
188d0 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
188e0 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
188f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18900 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
18910 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
18920 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
18930 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
18940 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
18950 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73  UTF8);.        s
18960 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f  qlite3VdbeMemSto
18970 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52  reType((Mem *)pR
18980 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
18990 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
189a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
189b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
189c0 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
189d0 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
189e0 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
189f0 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
18a00 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
18a10 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
18a20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
18a30 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
18a40 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
18a50 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
18a60 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
18a70 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
18a80 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
18a90 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
18aa0 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
18ab0 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
18ac0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
18ad0 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
18ae0 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
18af0 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
18b00 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
18b10 0a                                               .