/ Hex Artifact Content
Login

Artifact e85c8c7dc63b8e8941afe445a708bd188e5f9ba9:


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 2d 3e 69 73 50 72 65  return (p->isPre
0720: 70 61 72 65 56 32 20 3f 20 70 2d 3e 7a 53 71 6c  pareV2 ? p->zSql
0730: 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : 0);.}../*.** 
0740: 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  Swap all content
0750: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42   between two VDB
0760: 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  E structures..*/
0770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
0780: 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20  eSwap(Vdbe *pA, 
0790: 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62  Vdbe *pB){.  Vdb
07a0: 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20  e tmp, *pTmp;.  
07b0: 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74 6d  char *zTmp;.  tm
07c0: 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d  p = *pA;.  *pA =
07d0: 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d   *pB;.  *pB = tm
07e0: 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e  p;.  pTmp = pA->
07f0: 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65  pNext;.  pA->pNe
0800: 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a  xt = pB->pNext;.
0810: 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54    pB->pNext = pT
0820: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0830: 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50  >pPrev;.  pA->pP
0840: 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b  rev = pB->pPrev;
0850: 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70  .  pB->pPrev = p
0860: 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41  Tmp;.  zTmp = pA
0870: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53  ->zSql;.  pA->zS
0880: 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20  ql = pB->zSql;. 
0890: 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70   pB->zSql = zTmp
08a0: 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61 72  ;.  pB->isPrepar
08b0: 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 70  eV2 = pA->isPrep
08c0: 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65 66  areV2;.}..#ifdef
08d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
08e0: 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67  .** Turn tracing
08f0: 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f   on or off.*/.vo
0900: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  id sqlite3VdbeTr
0910: 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c  ace(Vdbe *p, FIL
0920: 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e  E *trace){.  p->
0930: 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d  trace = trace;.}
0940: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0950: 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61  esize the Vdbe.a
0960: 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  Op array so that
0970: 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74 20   it is at least 
0980: 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68  one op larger th
0990: 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a  an .** it was..*
09a0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f  *.** If an out-o
09b0: 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f  f-memory error o
09c0: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69  ccurs while resi
09d0: 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20  zing the array, 
09e0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
09f0: 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20  _NOMEM. In this 
0a00: 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e  case Vdbe.aOp an
0a10: 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20  d Vdbe.nOpAlloc 
0a20: 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61  remain .** uncha
0a30: 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f  nged (this is so
0a40: 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65   that any opcode
0a50: 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61  s already alloca
0a60: 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63  ted can be .** c
0a70: 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63  orrectly dealloc
0a80: 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
0a90: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
0aa0: 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  Vdbe)..*/.static
0ab0: 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79   int growOpArray
0ac0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64 62  (Vdbe *p){.  Vdb
0ad0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  eOp *pNew;.  int
0ae0: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0af0: 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c  lloc ? p->nOpAll
0b00: 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32  oc*2 : (int)(102
0b10: 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a  4/sizeof(Op)));.
0b20: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0b30: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0b40: 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   p->aOp, nNew*si
0b50: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0b60: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0b70: 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  nOpAlloc = sqlit
0b80: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
0b90: 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a 65  ->db, pNew)/size
0ba0: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e 61  of(Op);.    p->a
0bb0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
0bc0: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
0bd0: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
0be0: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f 2a  TE_NOMEM);.}../*
0bf0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e  .** Add a new in
0c00: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
0c10: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63   list of instruc
0c20: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e  tions current in
0c30: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52   the.** VDBE.  R
0c40: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
0c50: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
0c60: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
0c70: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  Parameters:.**.*
0c80: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20  *    p          
0c90: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
0ca0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20  the VDBE.**.**  
0cb0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20    op            
0cc0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72    The opcode for
0cd0: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
0ce0: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70  n.**.**    p1, p
0cf0: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61  2, p3      Opera
0d00: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nds.**.** Use th
0d10: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
0d20: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
0d30: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
0d40: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
0d50: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
0d60: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP4() function
0d70: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
0d80: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a  alue of the P4.*
0d90: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e  * operand..*/.in
0da0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
0db0: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
0dc0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
0dd0: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
0de0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
0df0: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
0e00: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
0e10: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
0e20: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
0e30: 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70  sert( op>0 && op
0e40: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70  <0xff );.  if( p
0e50: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b  ->nOpAlloc<=i ){
0e60: 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70 41  .    if( growOpA
0e70: 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 20  rray(p) ){.     
0e80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
0e90: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b  .  }.  p->nOp++;
0ea0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
0eb0: 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  [i];.  pOp->opco
0ec0: 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70  de = (u8)op;.  p
0ed0: 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f  Op->p5 = 0;.  pO
0ee0: 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f  p->p1 = p1;.  pO
0ef0: 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f  p->p2 = p2;.  pO
0f00: 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f  p->p3 = p3;.  pO
0f10: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70  p->p4.p = 0;.  p
0f20: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
0f30: 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78  NOTUSED;.  p->ex
0f40: 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  pired = 0;.#ifde
0f50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
0f60: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d   pOp->zComment =
0f70: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
0f80: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
0f90: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
0fa0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0fb0: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23  Op[i]);.#endif.#
0fc0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
0fd0: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
0fe0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
0ff0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1000: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1020: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1030: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1040: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1050: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1060: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1070: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1080: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1090: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10a0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
10b0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
10c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
10d0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
10e0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
10f0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1110: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1120: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1130: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1140: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1150: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1160: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1180: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1190: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
11a0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
11b0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
11e0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
11f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1200: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1210: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1220: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1230: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1250: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1260: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1270: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1280: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1290: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
12a0: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
12b0: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
12c0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
12d0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
12e0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
12f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1300: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
1310: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
1320: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1330: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1340: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  w symbolic label
1350: 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74   for an instruct
1360: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74  ion that has yet
1370: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e   to be.** coded.
1380: 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c    The symbolic l
1390: 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a  abel is really j
13a0: 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ust a negative n
13b0: 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c  umber.  The.** l
13c0: 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64  abel can be used
13d0: 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65   as the P2 value
13e0: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
13f0: 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a  .  Later, when.*
1400: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72  * the label is r
1410: 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65  esolved to a spe
1420: 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74  cific address, t
1430: 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61  he VDBE will sca
1440: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73  n.** through its
1450: 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20   operation list 
1460: 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76  and change all v
1470: 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63  alues of P2 whic
1480: 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c  h match.** the l
1490: 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65  abel into the re
14a0: 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a  solved address..
14b0: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b  **.** The VDBE k
14c0: 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76  nows that a P2 v
14d0: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
14e0: 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61  because labels a
14f0: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67  re.** always neg
1500: 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c  ative and P2 val
1510: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ues are suppose 
1520: 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  to be non-negati
1530: 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  ve..** Hence, a 
1540: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
1550: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61  e is a label tha
1560: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20  t has yet to be 
1570: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  resolved..**.** 
1580: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
1590: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
15a0: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
15b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15c0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
15d0: 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c  t i;.  i = p->nL
15e0: 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74  abel++;.  assert
15f0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1600: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1610: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65   if( i>=p->nLabe
1620: 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  lAlloc ){.    in
1630: 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41  t n = p->nLabelA
1640: 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20  lloc*2 + 5;.    
1650: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
1660: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1670: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
1680: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  bel,.           
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73 69              n*si
16b0: 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30  zeof(p->aLabel[0
16c0: 5d 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  ]));.    p->nLab
16d0: 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65  elAlloc = sqlite
16e0: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d  3DbMallocSize(p-
16f0: 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 2f  >db, p->aLabel)/
1700: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c  sizeof(p->aLabel
1710: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [0]);.  }.  if( 
1720: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1730: 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20   p->aLabel[i] = 
1740: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1750: 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   -1-i;.}../*.** 
1760: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
1770: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
1780: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
1790: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
17a0: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
17b0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
17c0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
17d0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
17e0: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
17f0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
1800: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
1810: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
1820: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
1830: 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  p, int x){.  int
1840: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
1850: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1860: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1870: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30  ;.  assert( j>=0
1880: 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20   && j<p->nLabel 
1890: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
18a0: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
18b0: 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  bel[j] = p->nOp;
18c0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53  .  }.}..#ifdef S
18d0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
18e0: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
18f0: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1900: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1910: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1920: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1930: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1940: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1950: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1960: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1970: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1980: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1990: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
19a0: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
19b0: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
19c0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
19d0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
19e0: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
19f0: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1a00: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1a10: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1a20: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1a30: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1a60: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1a70: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1a80: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1a90: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1aa0: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1ab0: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1ac0: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1ad0: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1ae0: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1af0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1b00: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1b10: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1b20: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1b30: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1b40: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1b50: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1b60: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1b70: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1b80: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1b90: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1ba0: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1bb0: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1bd0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1be0: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1bf0: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1c00: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1c10: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1c20: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1c30: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c50: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1c60: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1c70: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1c80: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1c90: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
1ca0: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
1cb0: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
1cc0: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
1cd0: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
1ce0: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
1cf0: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
1d00: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
1d10: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
1d20: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
1d30: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
1d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
1d50: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
1d60: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
1d70: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
1d80: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
1d90: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
1da0: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
1db0: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
1dc0: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
1dd0: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
1de0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
1df0: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
1e00: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
1e10: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
1e20: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1e30: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
1e40: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
1e50: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
1e60: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
1e70: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
1e80: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
1e90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1ea0: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
1eb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
1ec0: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
1ed0: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
1ee0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ef0: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
1f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
1f10: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
1f20: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
1f30: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
1f40: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
1f50: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
1f60: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
1f70: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
1f80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
1f90: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
1fa0: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
1fb0: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
1fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fd0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
1fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
1ff0: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2000: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2010: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2020: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
2030: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
2040: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
2050: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
2060: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
2070: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2080: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2090: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
20a0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
20b0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
20c0: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
20d0: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
20e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
20f0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2100: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2110: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2120: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2130: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
2140: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
2150: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
2160: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
2170: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2180: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2190: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
21a0: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
21b0: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
21c0: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
21d0: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
21e0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
21f0: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2200: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2210: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
2220: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
2230: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
2240: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
2250: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
2260: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
2270: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2280: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22a0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
22b0: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
22c0: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
22d0: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
22e0: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
22f0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2300: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2310: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
2320: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
2330: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
2340: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2350: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
2360: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
2370: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2380: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2390: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
23a0: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
23b0: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
23c0: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
23d0: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
23e0: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
23f0: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2400: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2410: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
2420: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
2430: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
2440: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
2450: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
2460: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
2470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2480: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2490: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
24a0: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
24b0: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
24c0: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
24d0: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
24e0: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
24f0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2500: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2510: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
2520: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
2530: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
2540: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
2550: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
2560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2570: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2580: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2590: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
25a0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
25b0: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
25c0: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
25d0: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
25e0: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
25f0: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2600: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2610: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
2620: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
2630: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
2640: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
2650: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
2660: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
2670: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2680: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2690: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
26a0: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
26b0: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
26c0: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
26d0: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
26e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
26f0: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2700: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2710: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
2720: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
2730: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
2740: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
2750: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
2760: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
2770: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2780: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2790: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
27a0: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
27b0: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
27c0: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
27d0: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
27e0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
27f0: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2800: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2810: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2820: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2830: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2840: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2850: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2860: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2870: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2880: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2890: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
28a0: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
28b0: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
28c0: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
28d0: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
28e0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
28f0: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2900: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2910: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2920: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  rg[] array..*/.s
2930: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
2940: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
2950: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
2960: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b  cArgs){.  int i;
2970: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
2980: 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b  = *pMaxFuncArgs;
2990: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e  .  Op *pOp;.  in
29a0: 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61  t *aLabel = p->a
29b0: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
29c0: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Only = 1;.  for(
29d0: 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d  pOp=p->aOp, i=p-
29e0: 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  >nOp-1; i>=0; i-
29f0: 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75  -, pOp++){.    u
2a00: 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  8 opcode = pOp->
2a10: 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28  opcode;..    if(
2a20: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63   opcode==OP_Func
2a30: 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  tion || opcode==
2a40: 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20  OP_AggStep ){.  
2a50: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e      if( pOp->p5>
2a60: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
2a70: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 23  rgs = pOp->p5;.#
2a80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2aa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
2ab0: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
2ac0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
2ad0: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
2ae0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
2af0: 3e 70 32 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  >p2;.#endif.    
2b00: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2b10: 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  ==OP_Transaction
2b20: 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29   && pOp->p2!=0 )
2b30: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f  {.      p->readO
2b40: 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  nly = 0;.#ifndef
2b50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2b60: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
2b70: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
2b80: 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20  OP_VFilter ){.  
2b90: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2ba0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20   assert( p->nOp 
2bb0: 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20  - i >= 3 );.    
2bc0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
2bd0: 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74  ].opcode==OP_Int
2be0: 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20  eger );.      n 
2bf0: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
2c00: 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72      if( n>nMaxAr
2c10: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
2c20: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  n;.#endif.    }.
2c30: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2c40: 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f  VdbeOpcodeHasPro
2c50: 70 65 72 74 79 28 6f 70 63 6f 64 65 2c 20 4f 50  perty(opcode, OP
2c60: 46 4c 47 5f 4a 55 4d 50 29 20 26 26 20 70 4f 70  FLG_JUMP) && pOp
2c70: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
2c80: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
2c90: 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  p2<p->nLabel );.
2ca0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
2cb0: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
2cc0: 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2];.    }.  }.  
2cd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
2ce0: 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b  >db, p->aLabel);
2cf0: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  .  p->aLabel = 0
2d00: 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  ;..  *pMaxFuncAr
2d10: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 7d  gs = nMaxArgs;.}
2d20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2d30: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2d40: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2d50: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
2d60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2d70: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2d80: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
2d90: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2da0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2db0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
2dc0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
2dd0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2de0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
2df0: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
2e00: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
2e10: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
2e20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2e30: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
2e40: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
2e50: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
2e60: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
2e70: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
2e80: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
2e90: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
2ea0: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
2eb0: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
2ec0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
2ed0: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
2ee0: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
2ef0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
2f00: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
2f10: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
2f20: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
2f30: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
2f40: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
2f50: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
2f60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
2f70: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
2f80: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
2f90: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
2fa0: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
2fb0: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
2fc0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
2fd0: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
2fe0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
2ff0: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
3000: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
3010: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
3020: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
3030: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3040: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
3050: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
3060: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
3070: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
3080: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
3090: 74 28 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d 75  t( p->aMutex.nMu
30a0: 74 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73  tex==0 );..  res
30b0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
30c0: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
30d0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
30e0: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
30f0: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
3100: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
3110: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
3120: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
3130: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
3140: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
3150: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
3160: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
3170: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3180: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
3190: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
31a0: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
31b0: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
31c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
31d0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
31e0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
31f0: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e  nOp + nOp > p->n
3200: 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f  OpAlloc && growO
3210: 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20  pArray(p) ){.   
3220: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3230: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   addr = p->nOp;.
3240: 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70    if( ALWAYS(nOp
3250: 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >0) ){.    int i
3260: 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74  ;.    VdbeOpList
3270: 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f   const *pIn = aO
3280: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
3290: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b  i<nOp; i++, pIn+
32a0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  +){.      int p2
32b0: 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20   = pIn->p2;.    
32c0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d    VdbeOp *pOut =
32d0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
32e0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70  ;.      pOut->op
32f0: 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f  code = pIn->opco
3300: 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  de;.      pOut->
3310: 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20  p1 = pIn->p1;.  
3320: 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 20      if( p2<0 && 
3330: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64  sqlite3VdbeOpcod
3340: 65 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 75  eHasProperty(pOu
3350: 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47  t->opcode, OPFLG
3360: 5f 4a 55 4d 50 29 20 29 7b 0a 20 20 20 20 20 20  _JUMP) ){.      
3370: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
3380: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33a0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
33b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33c0: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
33d0: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
33e0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
33f0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
3400: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
3410: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
3420: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3430: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3440: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
3450: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
3460: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3480: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
3490: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
34a0: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
34b0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
34c0: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
34d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
34e0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
34f0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3500: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
3510: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3520: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3530: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3540: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3550: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3560: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3570: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3590: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
35a0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
35b0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
35c0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
35d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
35e0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
35f0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3600: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3610: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3620: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
3630: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3640: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3650: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
3660: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3670: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3680: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
3690: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
36a0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
36b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
36c0: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
36d0: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
36e0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
36f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3700: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
3710: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
3720: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
3730: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
3740: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3750: 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  nOp>addr ){.    
3760: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3770: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3780: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3790: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
37a0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
37b0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
37c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
37d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
37e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
37f0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3800: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3810: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3820: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3830: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3840: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
3850: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3860: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3870: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
3880: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
3890: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
38a0: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
38b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
38c0: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
38d0: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
38e0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
38f0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
3900: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
3910: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  0 );.    p->aOp[
3920: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76  p->nOp-1].p5 = v
3930: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3940: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
3950: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
3960: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
3970: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
3980: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
3990: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
39a0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
39b0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
39c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
39d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
39e0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r){.  sqlite3Vdb
39f0: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
3a00: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
3a10: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
3a20: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
3a30: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
3a40: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
3a50: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
3a60: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
3a70: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
3a80: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
3a90: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
3aa0: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
3ab0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
3ac0: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c  *pDef){.  if( AL
3ad0: 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70  WAYS(pDef) && (p
3ae0: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
3af0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
3b00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3b10: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
3b20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3b30: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
3b40: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
3b50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
3b60: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
3b70: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
3b80: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
3b90: 70 34 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  p4 ){.    switch
3ba0: 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p4type ){.    
3bb0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
3bc0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
3bd0: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
3be0: 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20  P4_MPRINTF:.    
3bf0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
3c00: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
3c10: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
3c20: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
3c30: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3c40: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
3c50: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
3c60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
3c70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3c90: 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a  ase P4_VDBEFUNC:
3ca0: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46   {.        VdbeF
3cb0: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d  unc *pVdbeFunc =
3cc0: 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b   (VdbeFunc *)p4;
3cd0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3ce0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
3cf0: 62 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46  b, pVdbeFunc->pF
3d00: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71  unc);.        sq
3d10: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
3d20: 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63  uxData(pVdbeFunc
3d30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3d40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3d50: 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20  pVdbeFunc);.    
3d60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3d70: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
3d80: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
3d90: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
3da0: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
3db0: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
3dc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3dd0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
3de0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20  4_MEM: {.       
3df0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
3e00: 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  e((sqlite3_value
3e10: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
3e20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3e30: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
3e40: 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c   : {.        sql
3e50: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
3e60: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
3e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3e80: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3e90: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 3a 20  P4_SUBPROGRAM : 
3ea0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3eb0: 33 56 64 62 65 50 72 6f 67 72 61 6d 44 65 6c 65  3VdbeProgramDele
3ec0: 74 65 28 64 62 2c 20 28 53 75 62 50 72 6f 67 72  te(db, (SubProgr
3ed0: 61 6d 20 2a 29 70 34 2c 20 31 29 3b 0a 20 20 20  am *)p4, 1);.   
3ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
3f00: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
3f10: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
3f20: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
3f30: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
3f40: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
3f50: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
3f60: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
3f70: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
3f80: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
3f90: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
3fa0: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
3fb0: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
3fc0: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
3fd0: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
3fe0: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
3ff0: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
4000: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
4010: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
4020: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72  pOp++){.      fr
4030: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4040: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4050: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4060: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
4070: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
4080: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
4090: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
40a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
40b0: 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a  ree(db, aOp);.}.
40c0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
40d0: 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 6f   the ref-count o
40e0: 6e 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d  n the SubProgram
40f0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
4100: 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f  d as the.** seco
4110: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  nd argument. If 
4120: 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 72 65  the ref-count re
4130: 61 63 68 65 73 20 7a 65 72 6f 2c 20 66 72 65 65  aches zero, free
4140: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 0a   the structure..
4150: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20  **.** The array 
4160: 6f 66 20 56 44 42 45 20 6f 70 63 6f 64 65 73 20  of VDBE opcodes 
4170: 73 74 6f 72 65 64 20 61 73 20 53 75 62 50 72 6f  stored as SubPro
4180: 67 72 61 6d 2e 61 4f 70 20 69 73 20 66 72 65 65  gram.aOp is free
4190: 64 20 69 66 0a 2a 2a 20 65 69 74 68 65 72 20 74  d if.** either t
41a0: 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 72 65 61  he ref-count rea
41b0: 63 68 65 73 20 7a 65 72 6f 20 6f 72 20 70 61 72  ches zero or par
41c0: 61 6d 65 74 65 72 20 66 72 65 65 6f 70 20 69 73  ameter freeop is
41d0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
41e0: 20 53 69 6e 63 65 20 74 68 65 20 61 72 72 61 79   Since the array
41f0: 20 6f 66 20 6f 70 63 6f 64 65 73 20 70 6f 69 6e   of opcodes poin
4200: 74 65 64 20 74 6f 20 62 79 20 53 75 62 50 72 6f  ted to by SubPro
4210: 67 72 61 6d 2e 61 4f 70 20 6d 61 79 20 64 69 72  gram.aOp may dir
4220: 65 63 74 6c 79 0a 2a 2a 20 6f 72 20 69 6e 64 69  ectly.** or indi
4230: 72 65 63 74 6c 79 20 63 6f 6e 74 61 69 6e 20 61  rectly contain a
4240: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
4250: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74 72  e SubProgram str
4260: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a  ucture itself..*
4270: 2a 20 42 79 20 70 61 73 73 69 6e 67 20 61 20 6e  * By passing a n
4280: 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 6f 70 20 70  on-zero freeop p
4290: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 20 63 61  arameter, the ca
42a0: 6c 6c 65 72 20 6d 61 79 20 65 6e 73 75 72 65 20  ller may ensure 
42b0: 74 68 61 74 20 61 6c 6c 0a 2a 2a 20 53 75 62 50  that all.** SubP
42c0: 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72 65  rogram structure
42d0: 73 20 61 6e 64 20 74 68 65 69 72 20 61 4f 70 20  s and their aOp 
42e0: 61 72 72 61 79 73 20 61 72 65 20 66 72 65 65 64  arrays are freed
42f0: 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  , even when ther
4300: 65 0a 2a 2a 20 61 72 65 20 73 75 63 68 20 63 69  e.** are such ci
4310: 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
4320: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4330: 65 33 56 64 62 65 50 72 6f 67 72 61 6d 44 65 6c  e3VdbeProgramDel
4340: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
4350: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 2c 20   SubProgram *p, 
4360: 69 6e 74 20 66 72 65 65 6f 70 29 7b 0a 20 20 69  int freeop){.  i
4370: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
4380: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
4390: 0a 20 20 20 20 69 66 28 20 66 72 65 65 6f 70 20  .    if( freeop 
43a0: 7c 7c 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  || p->nRef==1 ){
43b0: 0a 20 20 20 20 20 20 4f 70 20 2a 61 4f 70 20 3d  .      Op *aOp =
43c0: 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 70   p->aOp;.      p
43d0: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 20 20 20  ->aOp = 0;.     
43e0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
43f0: 28 64 62 2c 20 61 4f 70 2c 20 70 2d 3e 6e 4f 70  (db, aOp, p->nOp
4400: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 20  );.      p->nOp 
4410: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
4420: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
4430: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
4440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4450: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ree(db, p);.    
4460: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
4470: 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73  Change N opcodes
4480: 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64   starting at add
4490: 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a  r to No-ops..*/.
44a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
44b0: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
44c0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
44d0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d  int N){.  if( p-
44e0: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
44f0: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
4500: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
4510: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4520: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ;.    while( N--
4530: 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34   ){.      freeP4
4540: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
4550: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
4560: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
4570: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
4580: 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ));.      pOp->o
4590: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
45a0: 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20  .      pOp++;.  
45b0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
45c0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
45d0: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
45e0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
45f0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
4600: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4610: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
4620: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
4630: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
4640: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
4650: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
4660: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
4670: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
4680: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
4690: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
46a0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
46b0: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
46c0: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
46d0: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
46e0: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
46f0: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
4700: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
4710: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4720: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
4730: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
4740: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
4750: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
4760: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
4770: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
4780: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
4790: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
47a0: 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP4..**.** If
47b0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69   n==P4_KEYINFO i
47c0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34  t means that zP4
47d0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
47e0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
47f0: 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  ture..** A copy 
4800: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b  is made of the K
4810: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4820: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
4830: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
4840: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f  lite3_malloc, to
4850: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
4860: 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c  he Vdbe is final
4870: 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b  ized..** n==P4_K
4880: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
4890: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50  ndicates that zP
48a0: 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65  4 points to a Ke
48b0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  yInfo structure.
48c0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ** stored in mem
48d0: 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c  ory that the cal
48e0: 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64  ler has obtained
48f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
4900: 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61  lloc. The .** ca
4910: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ller should not 
4920: 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  free the allocat
4930: 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
4940: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4950: 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69  dbe is.** finali
4960: 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zed..** .** Othe
4970: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
4980: 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c  4_STATIC, P4_COL
4990: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
49a0: 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69  ate that zP4 poi
49b0: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
49c0: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
49d0: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
49e0: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
49f0: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
4a00: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
4a10: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
4a20: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
4a30: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
4a40: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
4a50: 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20  hange P4 on the 
4a60: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
4a70: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
4a80: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4a90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4aa0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4ab0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
4ac0: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P4, int n){.  Op
4ad0: 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33   *pOp;.  sqlite3
4ae0: 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
4af0: 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
4b00: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
4b10: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4b20: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4b30: 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  f( p->aOp==0 || 
4b40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4b50: 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21 3d   ){.    if ( n!=
4b60: 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21  P4_KEYINFO && n!
4b70: 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20 20  =P4_VTAB ) {.   
4b80: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c     freeP4(db, n,
4b90: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
4ba0: 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP4);.    }.  
4bb0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4bc0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
4bd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
4be0: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  dr<p->nOp );.  i
4bf0: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
4c00: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
4c10: 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   1;.  }.  pOp = 
4c20: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
4c30: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
4c40: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
4c50: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70  .p);.  pOp->p4.p
4c60: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50   = 0;.  if( n==P
4c70: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
4c80: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
4c90: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
4ca0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
4cb0: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
4cc0: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
4cd0: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
4ce0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
4cf0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
4d00: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
4d10: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
4d20: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
4d30: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
4d40: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP4==0 ){.    p
4d50: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
4d60: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4d70: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P4_NOTUSED;.  }e
4d80: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
4d90: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
4da0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
4db0: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
4dc0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
4dd0: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
4de0: 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP4)->nField;.  
4df0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
4e00: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
4e10: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
4e20: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
4e30: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
4e40: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
4e50: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  ite3Malloc( nByt
4e60: 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  e );.    pOp->p4
4e70: 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  .pKeyInfo = pKey
4e80: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
4e90: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
4ea0: 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a  u8 *aSortOrder;.
4eb0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65        memcpy(pKe
4ec0: 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74  yInfo, zP4, nByt
4ed0: 65 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f  e);.      aSortO
4ee0: 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
4ef0: 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  >aSortOrder;.   
4f00: 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65     if( aSortOrde
4f10: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  r ){.        pKe
4f20: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4f30: 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  r = (unsigned ch
4f40: 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  ar*)&pKeyInfo->a
4f50: 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20  Coll[nField];.  
4f60: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65        memcpy(pKe
4f70: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4f80: 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e  r, aSortOrder, n
4f90: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Field);.      }.
4fa0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4fb0: 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P4_KEYINFO;.
4fc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4fd0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
4fe0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
4ff0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5000: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a  _NOTUSED;.    }.
5010: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5020: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
5030: 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  F ){.    pOp->p4
5040: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
5050: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5060: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
5070: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
5080: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70  _VTAB ){.    pOp
5090: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
50a0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
50b0: 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a  type = P4_VTAB;.
50c0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c      sqlite3VtabL
50d0: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  ock((VTable *)zP
50e0: 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  4);.    assert( 
50f0: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d  ((VTable *)zP4)-
5100: 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  >db==p->db );.  
5110: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
5120: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
5130: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
5140: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
5150: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
5160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
5170: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
5180: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
5190: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
51a0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
51b0: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
51c0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
51d0: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
51e0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
51f0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  DEBUG./*.** Chan
5200: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
5210: 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72  n the the most r
5220: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
5230: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
5240: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
5250: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
5260: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
5270: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
5280: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
5290: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
52a0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
52b0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
52c0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
52d0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
52e0: 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  build..*/.void s
52f0: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
5300: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5310: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5320: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5330: 61 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72  ap;.  if( !p ) r
5340: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
5350: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
5360: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
5370: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
5380: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5390: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
53a0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
53b0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
53c0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72  >nOp ){.    char
53d0: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b   **pz = &p->aOp[
53e0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
53f0: 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  nt;.    va_start
5400: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
5410: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5420: 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20  (p->db, *pz);.  
5430: 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56    *pz = sqlite3V
5440: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5450: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
5460: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5470: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5480: 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56  dbeNoopComment(V
5490: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
54a0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
54b0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
54c0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
54d0: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rn;.  sqlite3Vdb
54e0: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
54f0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  op);.  assert( p
5500: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
5510: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
5520: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
5530: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5540: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
5550: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5560: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
5570: 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  Op ){.    char *
5580: 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  *pz = &p->aOp[p-
5590: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
55a0: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
55b0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
55c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
55d0: 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20  ->db, *pz);.    
55e0: 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  *pz = sqlite3VMP
55f0: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
5600: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
5610: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
5620: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
5630: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UG */../*.** Ret
5640: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
5650: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
5660: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
5670: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
5680: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
5690: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
56a0: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
56b0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
56c0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
56d0: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
56e0: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
56f0: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
5700: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
5710: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
5720: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
5730: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
5740: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
5750: 61 62 6c 65 20 61 6e 64 20 77 72 69 74 61 62 6c  able and writabl
5760: 65 2c 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f  e, but it has no
5770: 20 65 66 66 65 63 74 2e 20 20 54 68 65 20 72 65   effect.  The re
5780: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 0a  turn of a dummy.
5790: 2a 2a 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73  ** opcode allows
57a0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e   the call to con
57b0: 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e  tinue functionin
57c0: 67 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  g after a OOM fa
57d0: 75 6c 74 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  ult without.** h
57e0: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
57f0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
5800: 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  urn from this ro
5810: 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64  utine is a valid
5820: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
5830: 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66  About the #ifdef
5840: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5850: 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  CE:  Normally, t
5860: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
5870: 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75  ever called.** u
5880: 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20  nless p->nOp>0. 
5890: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
58a0: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20   in the absense 
58b0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  of SQLITE_OMIT_T
58c0: 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54  RACE,.** an OP_T
58d0: 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  race instruction
58e0: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72   is always inser
58f0: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  ted by sqlite3Vd
5900: 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20  beGet() as soon 
5910: 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45  as.** a new VDBE
5920: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f   is created.  So
5930: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20   we are free to 
5940: 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e  set addr to p->n
5950: 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20  Op-1 without.** 
5960: 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65  having to double
5970: 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73  -check to make s
5980: 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73  ure that the res
5990: 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  ult is non-negat
59a0: 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53  ive. But.** if S
59b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
59c0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
59d0: 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69   OP_Trace is omi
59e0: 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e  tted and we do n
59f0: 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  eed to.** check 
5a00: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
5a10: 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e  nOp-1 before con
5a20: 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65  tinuing..*/.Vdbe
5a30: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
5a40: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
5a50: 74 20 61 64 64 72 29 7b 0a 20 20 73 74 61 74 69  t addr){.  stati
5a60: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 0a  c VdbeOp dummy;.
5a70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5a80: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5a90: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
5aa0: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
5ab0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
5ac0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
5ad0: 30 20 29 20 72 65 74 75 72 6e 20 26 64 75 6d 6d  0 ) return &dumm
5ae0: 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64  y;.#endif.    ad
5af0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5b00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
5b10: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
5b20: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
5b30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5b40: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
5b50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
5b60: 20 20 20 72 65 74 75 72 6e 20 26 64 75 6d 6d 79     return &dummy
5b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5b80: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
5b90: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
5ba0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5bb0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c  OMIT_EXPLAIN) ||
5bc0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
5bd0: 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69  ) \.     || defi
5be0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
5bf0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
5c00: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
5c10: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
5c20: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
5c30: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
5c40: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
5c50: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
5c60: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
5c70: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
5c80: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
5c90: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34   char *displayP4
5ca0: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
5cb0: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
5cc0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d  ){.  char *zP4 =
5cd0: 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74   zTemp;.  assert
5ce0: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
5cf0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34   switch( pOp->p4
5d00: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
5d10: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
5d20: 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  IC:.    case P4_
5d30: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
5d40: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
5d50: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
5d60: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
5d70: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c  yInfo;.      sql
5d80: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
5d90: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79  emp, zTemp, "key
5da0: 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e  info(%d", pKeyIn
5db0: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
5dc0: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
5dd0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
5de0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
5df0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
5e00: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
5e10: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
5e20: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
5e30: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
5e40: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
5e50: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
5e60: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c  te3Strlen30(pCol
5e70: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
5e80: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
5e90: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
5ea0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
5eb0: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
5ed0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
5ee0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
5ef0: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
5f00: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
5f10: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
5f20: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
5f30: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
5f40: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
5f50: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
5f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5f70: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
5f80: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
5f90: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
5fa0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
5fb0: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
5fc0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
5fd0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
5fe0: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
5ff0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
6000: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6010: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
6020: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
6030: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
6040: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
6050: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
6060: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6070: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
6080: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
6090: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
60a0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
60b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
60c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
60d0: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
60e0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
60f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6100: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
6110: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
6120: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
6130: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
6140: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6150: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6160: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
6170: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
6180: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
6190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
61a0: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
61b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
61c0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
61d0: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
61e0: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
61f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6200: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
6210: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6220: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6230: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
6240: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
6250: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6260: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
6270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6280: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6290: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
62a0: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
62b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
62c0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
62d0: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
62e0: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
62f0: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
6300: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
6310: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
6320: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
6330: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
6340: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
6350: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
6360: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
6370: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
6380: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
6390: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
63a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
63b0: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
63c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
63d0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
63e0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
63f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6400: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6410: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
6420: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
6430: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6440: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6450: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
6460: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
6470: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
6480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
6490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
64a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
64b0: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
64c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
64d0: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
64e0: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
64f0: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
6500: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6510: 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a  p, zTemp, "vtab:
6520: 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70  %p:%p", pVtab, p
6530: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a  Vtab->pModule);.
6540: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6550: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
6560: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
6570: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6580: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6590: 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79  zTemp, "intarray
65a0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
65b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
65c0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b  P4_SUBPROGRAM: {
65d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
65e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
65f0: 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29  Temp, "program")
6600: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6610: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6620: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
6630: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
6640: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
6650: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
6660: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
6670: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
6680: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
6690: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
66a0: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
66b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
66c0: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
66d0: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
66e0: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
66f0: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
6700: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6710: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
6720: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69   *p, int i){.  i
6730: 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72  nt mask;.  asser
6740: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
6750: 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69 7a  db->nDb && i<siz
6760: 65 6f 66 28 75 33 32 29 2a 38 20 29 3b 0a 20 20  eof(u32)*8 );.  
6770: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
6780: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
6790: 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20  sk)*8 );.  mask 
67a0: 3d 20 28 28 75 33 32 29 31 29 3c 3c 69 3b 0a 20  = ((u32)1)<<i;. 
67b0: 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61   if( (p->btreeMa
67c0: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
67d0: 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  .    p->btreeMas
67e0: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73  k |= mask;.    s
67f0: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
6800: 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e  ArrayInsert(&p->
6810: 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61  aMutex, p->db->a
6820: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a  Db[i].pBt);.  }.
6830: 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  }...#if defined(
6840: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
6850: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6860: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
6870: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
6880: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
6890: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
68a0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
68b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
68c0: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
68d0: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
68e0: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
68f0: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
6900: 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  50];.  static co
6910: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
6920: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
6930: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73  %4d %4d %4d %-4s
6940: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
6950: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
6960: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
6970: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
6980: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
6990: 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74  zPtr));.  fprint
69a0: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
69b0: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
69c0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
69d0: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
69e0: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
69f0: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
6a00: 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c  ->p5,.#ifdef SQL
6a10: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
6a20: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20  pOp->zComment ? 
6a30: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20  pOp->zComment : 
6a40: 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  "".#else.      "
6a50: 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  ".#endif.  );.  
6a60: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
6a70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
6a80: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
6a90: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
6aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6ab0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
6ac0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
6ad0: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
6ae0: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20      Mem *pEnd;. 
6af0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
6b00: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
6b10: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
6b20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
6b30: 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70  .    for(pEnd=&p
6b40: 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [N]; p<pEnd; p++
6b50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
6b60: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
6b70: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
6b80: 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  db );..      /* 
6b90: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
6ba0: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
6bb0: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
6bc0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
6bd0: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
6be0: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
6bf0: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
6c00: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
6c10: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
6c20: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
6c30: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
6c40: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
6c50: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
6c60: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
6c70: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
6c80: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
6c90: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
6ca0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
6cb0: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
6cc0: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
6cd0: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
6ce0: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
6cf0: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
6d00: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
6d10: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
6d20: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
6d30: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
6d40: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
6d50: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
6d60: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
6d70: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
6d80: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
6d90: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
6da0: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
6db0: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
6dc0: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
6dd0: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
6de0: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
6df0: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
6e00: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
6e10: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
6e20: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
6e30: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
6e40: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
6e50: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
6e60: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
6e70: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
6e80: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
6e90: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
6ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
6eb0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
6ec0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
6ed0: 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >zMalloc ){.    
6ee0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6ef0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
6f00: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d  );.        p->zM
6f10: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
6f20: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
6f30: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
6f40: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
6f50: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
6f60: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
6f70: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
6f80: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
6f90: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
6fa0: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
6fb0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
6fc0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
6fd0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
6fe0: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
6ff0: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
7000: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
7010: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
7020: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
7030: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
7040: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
7050: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
7060: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
7070: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
7080: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
7090: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
70a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
70b0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
70c0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
70d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
70e0: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
70f0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
7100: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
7110: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
7120: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7130: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
7140: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
7150: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
7160: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
7170: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
7180: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
7190: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
71a0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
71b0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
71c0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
71d0: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
71e0: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
71f0: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
7200: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
7210: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
7220: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
7230: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
7240: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
7250: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
7260: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
7270: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
7280: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
7290: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
72a0: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
72b0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
72c0: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
72d0: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
72e0: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
72f0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
7300: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
7310: 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  AN..*/.int sqlit
7320: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
7330: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
7340: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
7350: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
7360: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
7390: 20 6f 66 20 72 6f 77 73 20 74 6f 20 72 65 74 75   of rows to retu
73a0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  rn */.  int nSub
73b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73d0: 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64  Number of sub-vd
73e0: 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20  bes seen so far 
73f0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
7400: 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20  **apSub = 0;    
7410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
7420: 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  ay of sub-vdbes 
7430: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d  */.  Mem *pSub =
7440: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
7450: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
7460: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
7470: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20  QLITE_OK;.  Mem 
7480: 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75  *pMem = p->pResu
7490: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
74a0: 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [1];..  assert( 
74b0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
74c0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
74d0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
74e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
74f0: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
7500: 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20  MAGIC_BUSY );.  
7510: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
7520: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
7530: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
7540: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
7550: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
7560: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
7570: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
7580: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
7590: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
75a0: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
75b0: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
75c0: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
75d0: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
75e0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
75f0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
7600: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
7610: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
7620: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
7630: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
7640: 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  , 8);..  if( p->
7650: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
7660: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
7670: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
7680: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
7690: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
76a0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
76b0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
76c0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
76d0: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
76e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
76f0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
7700: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7710: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
7720: 75 74 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  ut total number 
7730: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
7740: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
7750: 20 74 68 69 73 20 0a 20 20 2a 2a 20 45 58 50 4c   this .  ** EXPL
7760: 41 49 4e 20 70 72 6f 67 72 61 6d 2e 20 20 2a 2f  AIN program.  */
7770: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
7780: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61  ;.  if( p->expla
7790: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 70 53 75  in==1 ){.    pSu
77a0: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
77b0: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
77c0: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
77d0: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
77e0: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
77f0: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
7800: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
7810: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
7820: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7830: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
7840: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
7850: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
7860: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
7870: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
7880: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
7890: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
78a0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
78b0: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
78c0: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
78d0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
78e0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
78f0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
7900: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
7910: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
7920: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
7930: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
7940: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7950: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
7960: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
7970: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
7980: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
7990: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
79a0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
79b0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
79c0: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
79d0: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
79e0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
79f0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  se{.      int j;
7a00: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
7a10: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
7a20: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
7a30: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
7a40: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
7a50: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
7a60: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
7a70: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
7a80: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
7a90: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
7aa0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
7ab0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
7ac0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
7ad0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
7ae0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
7af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
7b20: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
7b30: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
7b40: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
7b50: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
7b60: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
7b70: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
7b80: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
7b90: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
7ba0: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
7bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
7bc0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
7bd0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
7be0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
7bf0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
7c00: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
7c10: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
7c20: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
7c30: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
7c40: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  ..      if( pOp-
7c50: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
7c60: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
7c70: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
7c80: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
7c90: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
7ca0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
7cb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
7cc0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
7cd0: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
7ce0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
7cf0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
7d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7d10: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
7d20: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
7d30: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
7d40: 20 6e 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20   nByte, 1) ){.  
7d50: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
7d60: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
7d70: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
7d80: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
7d90: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
7da0: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
7db0: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
7dc0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
7dd0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
7de0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
7df0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
7e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
7e10: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
7e20: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
7e30: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
7e40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
7e60: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
7e70: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
7e80: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
7e90: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
7ea0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
7eb0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
7ec0: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ee0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
7ef0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
7f00: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
7f10: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
7f20: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
7f30: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
7f40: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
7f50: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
7f60: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70  /* P3 */.      p
7f90: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
7fa0: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
7fb0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a    pMem++;.    }.
7fc0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7fd0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
7fe0: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
7ff0: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
8000: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
8010: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8020: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
8030: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8040: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
8050: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
8060: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
8070: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
8080: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
8090: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
80a0: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
80b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
80c0: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
80d0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
80e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
80f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8100: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
8110: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
8120: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
8130: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
8140: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
8150: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
8160: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8170: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
8180: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
8190: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
81a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
81b0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
81c0: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
81d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
81e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
81f0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8200: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
8220: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8230: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
8240: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
8250: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
8260: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8270: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
8280: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
8290: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
82a0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
82b0: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
82c0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
82d0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
82e0: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
82f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
8300: 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d     if( pOp->zCom
8310: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
8320: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8330: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
8340: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
8350: 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b  = pOp->zComment;
8360: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
8370: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
8380: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
8390: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
83a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
83b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
83c0: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
83d0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
83e0: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
83f0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8400: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
8430: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
8440: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
8450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8460: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
8470: 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78  n = 8 - 5*(p->ex
8480: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
8490: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
84a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
84b0: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
84c0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
84d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
84e0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
84f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8500: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
8510: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
8520: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
8530: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
8540: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8550: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
8560: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
8570: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
8580: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
8590: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
85a0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
85b0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
85c0: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
85d0: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
85e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
85f0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
8600: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
8610: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
8620: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
8630: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
8640: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
8650: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8660: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
8670: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8680: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
8690: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
86a0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
86b0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
86c0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
86d0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
86e0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
86f0: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
8700: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
8710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
8720: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
8730: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
8740: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
8750: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
8760: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
8770: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
8780: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
8790: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
87a0: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
87b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
87c0: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
87d0: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
87e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
87f0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
8800: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
8810: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
8820: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
8830: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
8840: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
8850: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
8860: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
8870: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
8880: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
8890: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
88a0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
88b0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
88c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
88d0: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
88e0: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
88f0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
8900: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
8910: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
8920: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
8930: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
8940: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
8950: 65 72 2e 20 20 4d 61 6b 65 20 2a 70 70 20 70 6f  er.  Make *pp po
8960: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c  int to the.** al
8970: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 20  located space.  
8980: 28 4e 6f 74 65 3a 20 20 70 70 20 69 73 20 61 20  (Note:  pp is a 
8990: 63 68 61 72 2a 20 72 61 74 68 65 72 20 74 68 61  char* rather tha
89a0: 6e 20 61 20 76 6f 69 64 2a 2a 20 74 6f 0a 2a 2a  n a void** to.**
89b0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
89c0: 20 70 6f 69 6e 74 65 72 20 61 6c 69 61 73 69 6e   pointer aliasin
89d0: 67 20 72 75 6c 65 73 20 6f 66 20 43 2e 29 20 20  g rules of C.)  
89e0: 2a 70 70 20 73 68 6f 75 6c 64 20 69 6e 69 74 69  *pp should initi
89f0: 61 6c 6c 79 0a 2a 2a 20 62 65 20 7a 65 72 6f 2e  ally.** be zero.
8a00: 20 20 49 66 20 2a 70 70 20 69 73 20 6e 6f 74 20    If *pp is not 
8a10: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
8a20: 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20   that the space 
8a30: 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
8a40: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
8a50: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
8a60: 73 20 61 20 6e 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  s a noop..**.** 
8a70: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
8a80: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
8a90: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
8aa0: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
8ab0: 74 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73  t to available s
8ac0: 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f  pace and pEnd po
8ad0: 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ints to the end 
8ae0: 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61  of the.** availa
8af0: 62 6c 65 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ble space..**.**
8b00: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f   *pnByte is a co
8b10: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
8b20: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
8b30: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
8b40: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
8b50: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
8b60: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
8b70: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f   space in *ppFro
8b80: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  m to satisfy the
8b90: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65  .** request, the
8ba0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  n increment *pnB
8bb0: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  yte by the amoun
8bc0: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
8bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8be0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 63   allocSpace(.  c
8bf0: 68 61 72 20 2a 70 70 2c 20 20 20 20 20 20 20 20  har *pp,        
8c00: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
8c10: 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20  et *pp to point 
8c20: 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  to allocated buf
8c30: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
8c40: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
8c60: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
8c70: 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20    u8 **ppFrom,  
8c80: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
8c90: 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20  : Allocate from 
8ca0: 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20  *ppFrom */.  u8 
8cb0: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
8cc0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8cd0: 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
8ce0: 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62  end of *ppFrom b
8cf0: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  uffer */.  int *
8d00: 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20  pnByte          
8d10: 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  /* If allocation
8d20: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c   cannot be made,
8d30: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
8d40: 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  te */.){.  asser
8d50: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
8d60: 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29  IGNMENT(*ppFrom)
8d70: 20 29 3b 0a 20 20 69 66 28 20 28 2a 28 76 6f 69   );.  if( (*(voi
8d80: 64 2a 2a 29 70 70 29 3d 3d 30 20 29 7b 0a 20 20  d**)pp)==0 ){.  
8d90: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
8da0: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
8db0: 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74   &(*ppFrom)[nByt
8dc0: 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20  e] <= pEnd ){.  
8dd0: 20 20 20 20 2a 28 76 6f 69 64 2a 2a 29 70 70 20      *(void**)pp 
8de0: 3d 20 28 76 6f 69 64 20 2a 29 2a 70 70 46 72 6f  = (void *)*ppFro
8df0: 6d 3b 0a 20 20 20 20 20 20 2a 70 70 46 72 6f 6d  m;.      *ppFrom
8e00: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
8e10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 42  else{.      *pnB
8e20: 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  yte += nByte;.  
8e30: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8e40: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
8e50: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
8e60: 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20  xecution.  This 
8e70: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
8e80: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
8e90: 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63  ating stack spac
8ea0: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  e and initializi
8eb0: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
8ec0: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
8ed0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
8ee0: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
8ef0: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
8f00: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
8f10: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
8f20: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
8f30: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f  ** This is the o
8f40: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
8f50: 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45  a VDBE from VDBE
8f60: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a  _MAGIC_INIT to.*
8f70: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  * VDBE_MAGIC_RUN
8f80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
8f90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
8fa0: 6c 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  led more than on
8fb0: 63 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76  ce on a single v
8fc0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
8fd0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 61 6c  ** The first cal
8fe0: 6c 20 69 73 20 6d 61 64 65 20 77 68 69 6c 65 20  l is made while 
8ff0: 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51  compiling the SQ
9000: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 75 62  L statement. Sub
9010: 73 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73  sequent.** calls
9020: 20 61 72 65 20 6d 61 64 65 20 61 73 20 70 61 72   are made as par
9030: 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
9040: 20 6f 66 20 72 65 73 65 74 74 69 6e 67 20 61 20   of resetting a 
9050: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a  statement to be.
9060: 2a 2a 20 72 65 2d 65 78 65 63 75 74 65 64 20 28  ** re-executed (
9070: 66 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73  from a call to s
9080: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 29 2e  qlite3_reset()).
9090: 20 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c   The nVar, nMem,
90a0: 20 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64   nCursor .** and
90b0: 20 69 73 45 78 70 6c 61 69 6e 20 70 61 72 61 6d   isExplain param
90c0: 65 74 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 70  eters are only p
90d0: 61 73 73 65 64 20 63 6f 72 72 65 63 74 20 76 61  assed correct va
90e0: 6c 75 65 73 20 74 68 65 20 66 69 72 73 74 20 74  lues the first t
90f0: 69 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74  ime.** the funct
9100: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f  ion is called. O
9110: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  n subsequent cal
9120: 6c 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ls, from sqlite3
9130: 5f 72 65 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a  _reset(), nVar.*
9140: 2a 20 69 73 20 70 61 73 73 65 64 20 2d 31 20 61  * is passed -1 a
9150: 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72  nd nMem, nCursor
9160: 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 61   and isExplain a
9170: 72 65 20 61 6c 6c 20 70 61 73 73 65 64 20 7a 65  re all passed ze
9180: 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ro..*/.void sqli
9190: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
91a0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
91d0: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20  /.  int nVar,   
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9200: 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53  '?' see in the S
9210: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
9220: 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20    int nMem,     
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65   /* Number of me
9250: 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c  mory cells to al
9260: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
9270: 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20  nCursor,        
9280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9290: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
92a0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
92b0: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
92e0: 72 20 6f 66 20 61 72 67 73 20 69 6e 20 53 75 62  r of args in Sub
92f0: 50 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  Programs */.  in
9300: 74 20 69 73 45 78 70 6c 61 69 6e 2c 20 20 20 20  t isExplain,    
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9320: 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c  True if the EXPL
9330: 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20  AIN keywords is 
9340: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
9350: 20 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c   usesStmtJournal
9360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9370: 72 75 65 20 74 6f 20 73 65 74 20 56 64 62 65 2e  rue to set Vdbe.
9380: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
9390: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
93a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
93b0: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
93c0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
93d0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
93e0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
93f0: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
9400: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
9410: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
9420: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
9430: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
9440: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
9450: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
9460: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
9470: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
9480: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
9490: 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  _RUN;..  /* For 
94a0: 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75  each cursor requ
94b0: 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63  ired, also alloc
94c0: 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ate a memory cel
94d0: 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63  l. Memory.  ** c
94e0: 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75  ells (nMem+1-nCu
94f0: 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63  rsor)..nMem, inc
9500: 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76  lusive, will nev
9510: 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20  er be used by.  
9520: 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  ** the vdbe prog
9530: 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65  ram. Instead the
9540: 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c  y are used to al
9550: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
9560: 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72  .  ** VdbeCursor
9570: 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74  /BtCursor struct
9580: 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f  ures. The blob o
9590: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
95a0: 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63  ted with .  ** c
95b0: 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65  ursor 0 is store
95c0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  d in memory cell
95d0: 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65   nMem. Memory ce
95e0: 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a  ll (nMem-1).  **
95f0: 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62   stores the blob
9600: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
9610: 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
9620: 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  r 1, etc..  **. 
9630: 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c   ** See also: al
9640: 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a  locateCursor()..
9650: 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e    */.  nMem += n
9660: 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c  Cursor;..  /* Al
9670: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
9680: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
9690: 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  s, SQL variables
96a0: 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61  , VDBE cursors a
96b0: 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61  nd .  ** an arra
96c0: 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c  y to marshal SQL
96d0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
96e0: 6e 74 73 20 69 6e 2e 20 54 68 69 73 20 69 73 20  nts in. This is 
96f0: 6f 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20 20  only done the.  
9700: 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  ** first time th
9710: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
9720: 61 6c 6c 65 64 20 66 6f 72 20 61 20 67 69 76 65  alled for a give
9730: 6e 20 56 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e  n VDBE, not when
9740: 20 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e   it is.  ** bein
9750: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71  g called from sq
9760: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 74 6f  lite3_reset() to
9770: 20 72 65 73 65 74 20 74 68 65 20 76 69 72 74 75   reset the virtu
9780: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f  al machine..  */
9790: 0a 20 20 69 66 28 20 6e 56 61 72 3e 3d 30 20 26  .  if( nVar>=0 &
97a0: 26 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c  & ALWAYS(db->mal
97b0: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b  locFailed==0) ){
97c0: 0a 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20  .    u8 *zCsr = 
97d0: 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d  (u8 *)&p->aOp[p-
97e0: 3e 6e 4f 70 5d 3b 0a 20 20 20 20 75 38 20 2a 7a  >nOp];.    u8 *z
97f0: 45 6e 64 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e  End = (u8 *)&p->
9800: 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d  aOp[p->nOpAlloc]
9810: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  ;.    int nByte;
9820: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
9830: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
9840: 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a      p->usesStmtJ
9850: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
9860: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20  sStmtJournal;.  
9870: 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20    if( isExplain 
9880: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
9890: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
98a0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
98b0: 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43  zCsr, 0, zEnd-zC
98c0: 73 72 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d  sr);.    zCsr +=
98d0: 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29   (zCsr - (u8*)0)
98e0: 26 37 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  &7;.    assert( 
98f0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
9900: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20  MENT(zCsr) );.. 
9910: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42     do {.      nB
9920: 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  yte = 0;.      a
9930: 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a  llocSpace((char*
9940: 29 26 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  )&p->aMem, nMem*
9950: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
9960: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
9970: 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70  );.      allocSp
9980: 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61  ace((char*)&p->a
9990: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
99a0: 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (Mem), &zCsr, zE
99b0: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
99c0: 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63     allocSpace((c
99d0: 68 61 72 2a 29 26 70 2d 3e 61 70 41 72 67 2c 20  har*)&p->apArg, 
99e0: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
99f0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
9a00: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61  &nByte);.      a
9a10: 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a  llocSpace((char*
9a20: 29 26 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  )&p->azVar, nVar
9a30: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
9a40: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
9a50: 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  yte);.      allo
9a60: 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70  cSpace((char*)&p
9a70: 2d 3e 61 70 43 73 72 2c 20 0a 20 20 20 20 20 20  ->apCsr, .      
9a80: 20 20 20 20 20 20 20 20 20 20 20 6e 43 75 72 73             nCurs
9a90: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
9aa0: 72 73 6f 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  rsor*), &zCsr, z
9ab0: 45 6e 64 2c 20 26 6e 42 79 74 65 0a 20 20 20 20  End, &nByte.    
9ac0: 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e    );.      if( n
9ad0: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
9ae0: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
9af0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
9b00: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
9b10: 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20 3d 20   }.      zCsr = 
9b20: 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 20 20  p->pFree;.      
9b30: 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79  zEnd = &zCsr[nBy
9b40: 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  te];.    }while(
9b50: 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d   nByte && !db->m
9b60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
9b70: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
9b80: 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20   (u16)nCursor;. 
9b90: 20 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29     if( p->aVar )
9ba0: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20  {.      p->nVar 
9bb0: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
9bc0: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
9bd0: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
9be0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
9bf0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
9c00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
9c10: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
9c20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9c30: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
9c40: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
9c70: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
9c80: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  */.      p->nMem
9c90: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
9ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
9cb0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
9cc0: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f  em-1 */.      fo
9cd0: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
9ce0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
9cf0: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
9d00: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
9d10: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
9d20: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
9d30: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
9d40: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
9d50: 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65  or(n=1; n<p->nMe
9d60: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; n++){.    ass
9d70: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e  ert( p->aMem[n].
9d80: 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65  db==db );.  }.#e
9d90: 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20  ndif..  p->pc = 
9da0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
9db0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
9dc0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
9dd0: 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  bort;.  p->expla
9de0: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
9df0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
9e00: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
9e10: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
9e20: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
9e30: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
9e40: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
9e50: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
9e60: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
9e70: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
9e80: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
9e90: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
9ea0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
9eb0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
9ec0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
9ed0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20  cycles = 0;.    
9ee0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
9ef0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
9f00: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
9f10: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
9f20: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
9f30: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
9f40: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
9f50: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
9f60: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
9f70: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
9f80: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
9f90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
9fa0: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  }.  if( pCx->pBt
9fb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
9fc0: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
9fd0: 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  Bt);.    /* The 
9fe0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
9ff0: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
a000: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
a010: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a  exists, by.    *
a020: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
a030: 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  . */.  }else if(
a040: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
a050: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
a060: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
a070: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
a080: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a090: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a0a0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
a0b0: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
a0c0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
a0d0: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
a0e0: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
a0f0: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
a100: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
a110: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
a120: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
a130: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
a140: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
a150: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
a160: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
a170: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
a180: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  r);.    (void)sq
a190: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
a1a0: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
a1b0: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
a1c0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
a1d0: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
a1e0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
a1f0: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
a200: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
a210: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
a220: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
a230: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
a240: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
a250: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
a260: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
a270: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
a280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
a290: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
a2a0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
a2b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
a2c0: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61  Frame->v;.  v->a
a2d0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
a2e0: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
a2f0: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
a300: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
a310: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
a320: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
a330: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
a340: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
a350: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
a360: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
a370: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
a380: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
a390: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
a3a0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
a3b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
a3c0: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
a3d0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
a3e0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
a3f0: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
a400: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
a410: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
a420: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
a430: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
a440: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
a450: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
a460: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
a470: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
a480: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
a490: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
a4a0: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
a4b0: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
a4c0: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
a4d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
a4e0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
a4f0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
a500: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
a510: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
a520: 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20  e = p->pFrame;. 
a530: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
a540: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
a550: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
a560: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
a570: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a580: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
a590: 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d  Frame);.  }.  p-
a5a0: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70  >pFrame = 0;.  p
a5b0: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20  ->nFrame = 0;.. 
a5c0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
a5d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
a5e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
a5f0: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
a600: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
a610: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
a620: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
a630: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a640: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
a650: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
a660: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
a670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a680: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
a690: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
a6a0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
a6b0: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
a6c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
a6d0: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
a6e0: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
a6f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
a700: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
a710: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
a720: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
a730: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
a740: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
a750: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
a760: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
a770: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
a780: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
a790: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
a7a0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
a7b0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
a7c0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
a7d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a7e0: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
a7f0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
a800: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
a810: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
a820: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
a830: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
a840: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
a850: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
a860: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a870: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
a880: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
a890: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70  p->apCsr==0 || p
a8a0: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
a8b0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70  .  for(i=1; i<=p
a8c0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
a8d0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20  ert( p->aMem==0 
a8e0: 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  || p->aMem[i].fl
a8f0: 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  ags==MEM_Null );
a900: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
a910: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
a920: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
a930: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
a940: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
a950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a960: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
a970: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
a980: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
a990: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
a9a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
a9b0: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
a9c0: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
a9d0: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
a9e0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
a9f0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
aa00: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
aa10: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
aa20: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
aa30: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
aa40: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
aa50: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
aa60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
aa70: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
aa80: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
aa90: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
aaa0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
aab0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
aac0: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
aad0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
aae0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
aaf0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
ab00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ab10: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
ab20: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
ab30: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
ab40: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
ab50: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
ab60: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
ab70: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
ab80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
ab90: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
aba0: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
abb0: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
abc0: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
abd0: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
abe0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
abf0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
ac00: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
ac10: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
ac20: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
ac30: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
ac40: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
ac50: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
ac60: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
ac70: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
ac80: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
ac90: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
aca0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
acb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
acc0: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
acd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
ace0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
acf0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
ad00: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
ad10: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
ad20: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
ad30: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
ad40: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
ad50: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
ad60: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
ad70: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
ad80: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
ad90: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
ada0: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
adb0: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
adc0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
add0: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
ade0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
adf0: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
ae00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
ae10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
ae20: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
ae30: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
ae40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ae50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ae60: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
ae70: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
ae80: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
aeb0: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
aec0: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
aed0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
aef0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
af00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
af10: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
af20: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
af30: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
af40: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
af50: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
af60: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
af70: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
af80: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
af90: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
afa0: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
afb0: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
afc0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
afd0: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
afe0: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
aff0: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
b000: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
b010: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b020: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
b030: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
b040: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
b050: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
b060: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
b070: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
b080: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
b090: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
b0a0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
b0b0: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
b0c0: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
b0d0: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
b0e0: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
b0f0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
b100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
b110: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
b120: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
b130: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
b140: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
b150: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
b160: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
b170: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
b180: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
b190: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
b1a0: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
b1b0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
b1c0: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
b1d0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
b1e0: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
b1f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
b200: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
b210: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
b220: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
b230: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
b240: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
b250: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
b260: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
b270: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
b280: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
b290: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b2a0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
b2b0: 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
b2c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
b2d0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
b2e0: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
b2f0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
b300: 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
b310: 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
b320: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
b330: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
b340: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
b350: 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
b360: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
b370: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
b380: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
b390: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
b3a0: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
b3b0: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
b3c0: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
b3d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
b3e0: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
b3f0: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
b400: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
b410: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
b420: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
b430: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
b440: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
b450: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
b460: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
b470: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
b480: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
b490: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
b4a0: 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d  nc(db, &p->zErrM
b4b0: 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
b4c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b4d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
b4e0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
b4f0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
b500: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
b510: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
b520: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
b530: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
b540: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
b550: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
b560: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
b570: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
b580: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
b590: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
b5a0: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
b5b0: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
b5c0: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
b5d0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
b5e0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
b5f0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
b600: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
b610: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
b620: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
b630: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
b640: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
b650: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
b660: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
b670: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
b680: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
b690: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
b6a0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
b6b0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
b6c0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
b6d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
b6e0: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
b6f0: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
b700: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
b710: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
b720: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
b730: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
b740: 6b 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 73  k ){.    (void)s
b750: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
b760: 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62  db);.    rc = db
b770: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
b780: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
b790: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
b7a0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
b7b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
b7c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b7d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
b7e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b7f0: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
b800: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
b810: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
b820: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
b830: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
b840: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
b850: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
b860: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
b870: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
b880: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
b890: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
b8a0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
b8b0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
b8c0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
b8d0: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
b8e0: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
b8f0: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
b900: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
b910: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
b920: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
b930: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
b940: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
b950: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
b960: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
b970: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
b980: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
b990: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
b9a0: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
b9b0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
b9c0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
b9d0: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
b9e0: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
b9f0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
ba00: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
ba10: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
ba20: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
ba30: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
ba40: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
ba50: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
ba60: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
ba70: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
ba80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
ba90: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
baa0: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
bab0: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
bac0: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
bad0: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
bae0: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
baf0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
bb00: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
bb10: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
bb20: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
bb30: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
bb40: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
bb50: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
bb60: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
bb70: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
bb80: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
bb90: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
bba0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
bbb0: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
bbc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
bbd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
bbe0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
bbf0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
bc00: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
bc10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
bc20: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
bc30: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
bc40: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
bc50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bc60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bc70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
bc80: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
bc90: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
bca0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
bcb0: 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
bcc0: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
bcd0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
bce0: 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
bcf0: 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
bd00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
bd10: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
bd20: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
bd30: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
bd40: 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  micly..  */.#ifn
bd50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bd60: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
bd70: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
bd80: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
bd90: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
bda0: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
bdb0: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
bdc0: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
bdd0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
bde0: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
bdf0: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
be00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
be10: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
be20: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
be30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
be40: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
be50: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
be60: 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20     int res;..   
be70: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
be80: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
be90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20   name */.    do 
bea0: 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
beb0: 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dom;.      sqlit
bec0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
bed0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
bee0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
bef0: 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
bf00: 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
bf10: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
bf20: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
bf30: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
bf40: 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30  nFile, iRandom&0
bf50: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  x7fffffff);.    
bf60: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
bf70: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
bf80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bf90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
bfa0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
bfb0: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
bfc0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
bfd0: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
bfe0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
bff0: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
c000: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
c010: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c020: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
c030: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
c040: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c050: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
c060: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
c070: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
c080: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
c090: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
c0a0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
c0b0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
c0c0: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
c0d0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
c0e0: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
c0f0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
c100: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c110: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c120: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
c130: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
c140: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
c150: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
c160: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
c170: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
c180: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
c190: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
c1a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c1b0: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
c1c0: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
c1d0: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
c1e0: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
c1f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c200: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
c210: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
c220: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
c230: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
c240: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
c250: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
c260: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
c270: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
c280: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
c290: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
c2a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
c2b0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
c2c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
c2d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
c2e0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
c2f0: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
c300: 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65  nue;   /* Ignore
c310: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
c320: 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  se */.      if( 
c330: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
c340: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
c350: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
c360: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
c370: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
c380: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
c390: 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
c3a0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =0 ) continue;  
c3b0: 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72  /* Ignore :memor
c3c0: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
c3d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
c3e0: 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
c3f0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
c400: 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
c410: 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
c420: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
c430: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c440: 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
c450: 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
c460: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
c470: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
c480: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
c490: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
c4a0: 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
c4b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c4c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
c4d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
c4e0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
c4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
c500: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
c510: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
c520: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c530: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
c540: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
c550: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
c560: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c570: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
c580: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c590: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
c5a0: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
c5b0: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
c5c0: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
c5d0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
c5e0: 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
c5f0: 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
c600: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c610: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
c620: 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
c630: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
c640: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
c650: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
c660: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
c670: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
c680: 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
c690: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
c6a0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
c6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
c6c0: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
c6d0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
c6e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c6f0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
c700: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
c710: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
c720: 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
c730: 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
c740: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
c750: 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
c760: 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
c770: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
c780: 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
c790: 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
c7a0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
c7b0: 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
c7c0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
c7d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c7e0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
c7f0: 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
c800: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
c810: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
c820: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
c830: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
c840: 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
c850: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
c860: 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
c870: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
c880: 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
c890: 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
c8a0: 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
c8b0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
c8c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c8d0: 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
c8e0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
c8f0: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
c900: 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
c910: 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
c920: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
c930: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
c940: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
c950: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
c960: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
c970: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
c980: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
c990: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
c9a0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
c9b0: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
c9c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
c9d0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
c9e0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
c9f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ca00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
ca10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
ca20: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
ca30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
ca40: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
ca50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ca60: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
ca70: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
ca80: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
ca90: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
caa0: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
cab0: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
cac0: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
cad0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
cae0: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
caf0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
cb00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cb10: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
cb20: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
cb30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
cb40: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
cb50: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
cb60: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
cb70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
cb80: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
cb90: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
cba0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
cbb0: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
cbc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
cbd0: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
cbe0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
cbf0: 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
cc00: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
cc10: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
cc20: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
cc30: 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
cc40: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
cc50: 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
cc60: 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
cc70: 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
cc80: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
cc90: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
cca0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
ccb0: 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
ccc0: 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
ccd0: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
cce0: 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
ccf0: 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
cd00: 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
cd10: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
cd20: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
cd30: 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
cd40: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
cd50: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
cd60: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
cd70: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
cd80: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
cd90: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
cda0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
cdb0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
cdc0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
cdd0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
cde0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
cdf0: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
ce00: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
ce10: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
ce20: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
ce30: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
ce40: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
ce50: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
ce60: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
ce70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
ce80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ce90: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
cea0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
ceb0: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
cec0: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
ced0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
cee0: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
cef0: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
cf00: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
cf10: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
cf20: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
cf30: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
cf40: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
cf50: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
cf60: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
cf70: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
cf80: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
cf90: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
cfa0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
cfb0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
cfc0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
cfd0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
cfe0: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
cff0: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
d000: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
d010: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
d020: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
d030: 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d  Write = 0;.  p =
d040: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
d050: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
d060: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
d070: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
d080: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
d090: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
d0a0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
d0b0: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
d0c0: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
d0d0: 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
d0e0: 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76  ( cnt==db->activ
d0f0: 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73  eVdbeCnt );.  as
d100: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
d110: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
d120: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
d130: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
d140: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
d150: 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  /*.** For every 
d160: 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61  Btree that in da
d170: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d180: 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68  n db which .** h
d190: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
d1a0: 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61  , "trip" or inva
d1b0: 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73  lidate each curs
d1c0: 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74  or in.** that Bt
d1d0: 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  ree might have b
d1e0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
d1f0: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
d200: 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  ** can never be 
d210: 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69  used again.  Thi
d220: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
d230: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63   rollback.*** oc
d240: 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74  curs.  We have t
d250: 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f  o trip all the o
d260: 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76  ther cursors, ev
d270: 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f  en.** cursor fro
d280: 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64  m other VMs in d
d290: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
d2a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a  e connections,.*
d2b0: 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f  * so that none o
d2c0: 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73  f them try to us
d2d0: 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68  e the data at wh
d2e0: 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65  ich they.** were
d2f0: 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68   pointing and wh
d300: 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65  ich now may have
d310: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75   been changed du
d320: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c  e.** to the roll
d330: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65  back..**.** Reme
d340: 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c  mber that a roll
d350: 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20  back can delete 
d360: 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20  tables complete 
d370: 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72  and.** reorder r
d380: 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74  ootpages.  So it
d390: 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
d3a0: 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a  nt just to save.
d3b0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ** the state of 
d3c0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20  the cursor.  We 
d3d0: 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61  have to invalida
d3e0: 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  te the cursor.**
d3f0: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
d400: 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e  ever used again.
d410: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d420: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
d430: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
d440: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
d450: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
d460: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
d470: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
d480: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
d490: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26  Bt;.    if( p &&
d4a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
d4b0: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
d4c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
d4d0: 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
d4e0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a   SQLITE_ABORT);.
d4f0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
d500: 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
d510: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
d520: 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
d530: 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
d540: 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
d550: 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
d560: 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
d570: 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
d580: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
d590: 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
d5a0: 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
d5b0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
d5c0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
d5d0: 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
d5e0: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
d5f0: 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
d600: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
d610: 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
d620: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d630: 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e  ion is commtted.
d640: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
d650: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
d660: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
d670: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
d680: 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
d690: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
d6a0: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
d6b0: 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
d6c0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ent(Vdbe *p, int
d6d0: 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33   eOp){.  sqlite3
d6e0: 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e   *const db = p->
d6f0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
d700: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
d710: 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  If p->iStatement
d720: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
d730: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
d740: 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a   Vdbe opened a .
d750: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
d760: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
d770: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
d780: 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20   here. The only 
d790: 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  exception.  ** i
d7a0: 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72  s that an IO err
d7b0: 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75  or may have occu
d7c0: 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
d7d0: 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
d7e0: 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
d7f0: 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
d800: 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
d810: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
d820: 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
d830: 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
d840: 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
d850: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
d860: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
d870: 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
d880: 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
d890: 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
d8a0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
d8b0: 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
d8c0: 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
d8d0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
d8e0: 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
d8f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
d900: 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
d910: 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
d920: 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
d930: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
d940: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
d950: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
d960: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
d970: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
d980: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
d990: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
d9a0: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
d9b0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
d9d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
d9e0: 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
d9f0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
da00: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
da10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
da20: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
da30: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
da40: 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
da50: 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
da60: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
da70: 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
da80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
daa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
dab0: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
dac0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
dad0: 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
dae0: 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
daf0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
db00: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
db10: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
db20: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
db30: 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
db40: 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
db50: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
db60: 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
db70: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
db80: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
db90: 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
dba0: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
dbb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
dbc0: 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
dbd0: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
dbe0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
dbf0: 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
dc00: 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
dc10: 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  tDefCons;.    }.
dc20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
dc40: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
dc50: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
dc60: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
dc70: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
dc80: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
dc90: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
dca0: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
dcb0: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
dcc0: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
dcd0: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
dce0: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
dcf0: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
dd00: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
dd10: 6f 20 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65  o it.** sets the
dd20: 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d   BtShared.db mem
dd30: 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74  ber of each of t
dd40: 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
dd50: 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67  ctures, ensuring
dd60: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72  .** that the cor
dd70: 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65  rect busy-handle
dd80: 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  r callback is in
dd90: 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65  voked if require
dda0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  d..**.** If SQLi
ddb0: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
ddc0: 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75  safe but does su
ddd0: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
dde0: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a  he mode, then.**
ddf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
de00: 65 72 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b  erAll() is invok
de10: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
de20: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
de30: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
de40: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
de50: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
de60: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
de70: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
de80: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
de90: 56 4d 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e  VM. Of course on
dea0: 6c 79 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ly a subset of t
deb0: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 0a  hese structures.
dec0: 2a 2a 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73  ** will be acces
ded0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61  sed by the VM, a
dee0: 6e 64 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20  nd we could use 
def0: 56 64 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74  Vdbe.btreeMask t
df00: 6f 20 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74  o figure.** that
df10: 20 73 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74   subset out, but
df20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76   there is no adv
df30: 61 6e 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20  antage to doing 
df40: 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  so..**.** If SQL
df50: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
df60: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
df70: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
df80: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
df90: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
dfa0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69  s a no-op..*/.#i
dfb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dfc0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76  T_SHARED_CACHE.v
dfd0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
dfe0: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 56  utexArrayEnter(V
dff0: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  dbe *p){.#if SQL
e000: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
e010: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
e020: 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d  exArrayEnter(&p-
e030: 3e 61 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a  >aMutex);.#else.
e040: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
e050: 74 65 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23  terAll(p->db);.#
e060: 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a  endif.}.#endif..
e070: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e080: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
e090: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
e0a0: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
e0b0: 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
e0c0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
e0d0: 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
e0e0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
e0f0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
e100: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
e110: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
e120: 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
e130: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
e140: 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
e150: 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
e160: 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
e170: 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
e180: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
e190: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
e1a0: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
e1b0: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
e1c0: 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
e1d0: 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
e1e0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
e1f0: 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
e200: 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74  STRAINT and writ
e210: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65  e.** an error me
e220: 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
e230: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
e240: 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
e250: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
e260: 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
e270: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
e280: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
e290: 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
e2a0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
e2b0: 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
e2c0: 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
e2d0: 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66  Cons>0) || (!def
e2e0: 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
e2f0: 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a  onstraint>0) ){.
e300: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
e310: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
e320: 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
e330: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
e340: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
e350: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
e360: 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  db, "foreign key
e370: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
e380: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
e390: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e3a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
e3b0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
e3c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e3d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
e3e0: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
e3f0: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
e400: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
e410: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
e420: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
e430: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
e440: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
e450: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
e460: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
e470: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
e480: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
e490: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
e4a0: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
e4b0: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
e4c0: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
e4d0: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
e4e0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
e4f0: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
e500: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
e510: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
e520: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
e530: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
e540: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
e550: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
e560: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
e570: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
e580: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
e590: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
e5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
e5b0: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
e5c0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
e5d0: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
e5e0: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
e5f0: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
e600: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
e610: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
e620: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
e630: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
e660: 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
e670: 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
e680: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
e690: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
e6a0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
e6b0: 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
e6c0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
e6d0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
e6e0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
e6f0: 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
e700: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
e710: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
e720: 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
e730: 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
e740: 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
e750: 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
e760: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
e770: 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
e780: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
e790: 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
e7a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
e7b0: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
e7c0: 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
e7d0: 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
e7e0: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
e7f0: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
e800: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
e810: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
e820: 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
e830: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
e840: 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
e850: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
e860: 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
e870: 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
e880: 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
e890: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
e8a0: 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
e8b0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
e8c0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
e8d0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
e8e0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
e8f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f  NOMEM;.  }.  clo
e900: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
e910: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
e920: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
e930: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e940: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
e950: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
e960: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
e970: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
e980: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
e990: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
e9a0: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
e9b0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
e9c0: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
e9d0: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
e9e0: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
e9f0: 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
ea00: 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
ea10: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ea30: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
ea40: 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
ea50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
ea60: 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
ea70: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
ea80: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
ea90: 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  dbeMutexArrayEnt
eaa0: 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
eab0: 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
eac0: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
ead0: 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
eae0: 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
eaf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
eb00: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
eb10: 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69  OCKED );  /* Thi
eb20: 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65  s error no longe
eb30: 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  r exists */.    
eb40: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
eb50: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
eb60: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
eb70: 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
eb90: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
eba0: 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
ebb0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
ebc0: 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
ebd0: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
ebe0: 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
ebf0: 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65  ead-only, we nee
ec00: 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  d do no rollback
ec10: 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69   at all. Otherwi
ec20: 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  se,.      ** pro
ec30: 63 65 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ceed with the sp
ec40: 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
ec50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ec60: 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
ec70: 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
ec80: 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
ec90: 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51      if( (mrc==SQ
eca0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
ecb0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
ecc0: 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
ecd0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
ece0: 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
ecf0: 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
ed00: 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  BACK;.        }e
ed10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
ed20: 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
ed30: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
ed40: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
ed50: 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
ed60: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
ed70: 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
ed80: 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
ed90: 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
eda0: 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
edb0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
edc0: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
edd0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
ede0: 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
edf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
ee00: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
ee10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ee20: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
ee30: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
ee40: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
ee50: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
ee60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
ee70: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
ee80: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
ee90: 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
eea0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
eeb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
eec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eed0: 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
eee0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
eef0: 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
ef00: 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
ef10: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
ef20: 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
ef30: 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
ef40: 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
ef50: 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
ef60: 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
ef70: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
ef80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
ef90: 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
efa0: 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
efb0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
efc0: 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
efd0: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
efe0: 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
eff0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
f000: 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
f010: 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
f020: 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
f030: 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65  && db->writeVdbe
f040: 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  Cnt==(p->readOnl
f050: 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
f060: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
f070: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
f080: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
f090: 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
f0a0: 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
f0b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
f0c0: 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
f0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f0e0: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
f0f0: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
f100: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
f110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
f120: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
f130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
f140: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
f150: 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62  is true, the vdb
f160: 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75  e program was su
f170: 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20  ccessful .      
f180: 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27    ** or hit an '
f190: 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
f1a0: 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
f1b0: 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e no deferred fo
f1c0: 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 2a 2a  reign.        **
f1d0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
f1e0: 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20   to hold up the 
f1f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
f200: 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
f210: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20   .        ** is 
f220: 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
f230: 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
f240: 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
f250: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f260: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
f270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
f280: 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61  reeMutexArrayLea
f290: 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  ve(&p->aMutex);.
f2a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f2b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f2c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f2d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f2e0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
f2f0: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
f300: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
f310: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
f320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f330: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
f340: 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
f350: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
f360: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
f370: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
f380: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f390: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
f3a0: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
f3b0: 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
f3c0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
f3d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
f3e0: 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
f3f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
f400: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
f410: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
f420: 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
f430: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
f440: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f450: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f460: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
f470: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
f480: 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
f490: 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
f4a0: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
f4b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
f4c0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
f4d0: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
f4e0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
f4f0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
f500: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
f510: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
f520: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
f530: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
f540: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
f550: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
f560: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
f570: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
f580: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f590: 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
f5a0: 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
f5b0: 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
f5c0: 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
f5d0: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
f5e0: 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
f5f0: 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
f600: 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
f610: 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
f620: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
f630: 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
f640: 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
f650: 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
f660: 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 73 65  STRAINT, then se
f670: 74 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  t the error.    
f680: 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e  ** code to the n
f690: 65 77 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f  ew value..    */
f6a0: 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
f6b0: 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
f6c0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
f6d0: 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
f6e0: 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
f6f0: 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20        if( rc && 
f700: 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  (p->rc==SQLITE_O
f710: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
f720: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29  TE_CONSTRAINT) )
f730: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
f740: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71  = rc;.        sq
f750: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f760: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
f770: 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
f780: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
f790: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
f7a0: 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
f7b0: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
f7c0: 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
f7d0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f7e0: 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
f7f0: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
f800: 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
f810: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
f820: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
f830: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
f840: 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
f850: 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
f860: 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
f870: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
f880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f890: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
f8a0: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
f8b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
f8d0: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
f8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
f8f0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
f900: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
f910: 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
f920: 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
f930: 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
f940: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
f950: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
f960: 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
f970: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
f980: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f990: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
f9a0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
f9b0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
f9c0: 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
f9d0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
f9e0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
f9f0: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
fa00: 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
fa10: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
fa20: 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78  Leave(&p->aMutex
fa30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
fa40: 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
fa50: 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
fa60: 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
fa70: 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
fa80: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
fa90: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
faa0: 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  veVdbeCnt--;.   
fab0: 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
fac0: 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77  y ){.      db->w
fad0: 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  riteVdbeCnt--;. 
fae0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
faf0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
fb00: 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  nt>=db->writeVdb
fb10: 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  eCnt );.  }.  p-
fb20: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
fb30: 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
fb40: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
fb50: 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
fb60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
fb70: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
fb80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
fb90: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
fba0: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
fbb0: 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
fbc0: 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
fbd0: 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
fbe0: 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
fbf0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
fc00: 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
fc10: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
fc20: 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
fc30: 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
fc40: 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
fc50: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
fc60: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
fc70: 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
fc80: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
fc90: 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
fca0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
fcb0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
fcc0: 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
fcd0: 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
fce0: 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
fcf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fd00: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  OK;.}.../*.** Ea
fd10: 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
fd20: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
fd30: 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
fd40: 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
fd50: 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
fd60: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
fd70: 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
fd80: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
fd90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
fda0: 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
fdb0: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
fdc0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
fdd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
fde0: 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
fdf0: 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
fe00: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
fe10: 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
fe20: 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
fe30: 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
fe40: 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
fe50: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
fe60: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
fe70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fe80: 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
fe90: 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
fea0: 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
feb0: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
fec0: 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
fed0: 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
fee0: 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
fef0: 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
ff00: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
ff10: 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
ff20: 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
ff30: 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
ff40: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
ff50: 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
ff60: 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
ff70: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
ff80: 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
ff90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
ffa0: 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
ffb0: 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
ffc0: 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
ffd0: 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
ffe0: 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
fff0: 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
10000 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
10010 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
10020 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  w..  */.  (void)
10030 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
10040 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  db);.  sqlite3Vd
10050 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f  beHalt(p);.  (vo
10060 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
10070 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  Off(db);..  /* I
10080 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
10090 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
100a0 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
100b0 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
100c0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
100d0 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
100e0 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
100f0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
10100 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
10110 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
10120 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
10130 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
10140 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
10150 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
10160 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
10170 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
10180 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
10190 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
101a0 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
101b0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
101c0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
101d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
101e0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
101f0 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
10200 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
10210 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45  b->pErr,-1,p->zE
10220 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46  rrMsg,SQLITE_UTF
10230 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  8,SQLITE_TRANSIE
10240 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NT);.      sqlit
10250 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
10260 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  c();.      db->e
10270 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
10280 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
10290 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
102a0 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  sg);.      p->zE
102b0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
102c0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
102d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
102e0 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
102f0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
10300 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10310 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
10320 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
10330 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
10340 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
10350 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
10360 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
10370 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
10380 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
10390 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
103a0 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
103b0 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
103c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
103d0 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
103e0 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
103f0 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
10400 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
10410 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
10420 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
10430 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
10440 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
10450 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
10460 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
10470 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
10480 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
10490 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
104a0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
104b0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
104c0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
104d0 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
104e0 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
104f0 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
10500 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
10510 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
10520 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
10530 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
10540 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
10550 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
10560 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
10570 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
10580 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
10590 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
105a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
105b0 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
105c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
105d0 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
105e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
105f0 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
10600 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
10610 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
10620 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
10630 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
10640 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
10650 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
10660 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
10670 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
10680 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
10690 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
106a0 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
106b0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
106c0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
106d0 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
106e0 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
106f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10700 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
10710 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
10720 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
10730 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
10740 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
10750 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
10760 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
10770 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
10780 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
10790 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
107a0 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
107b0 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
107c0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
107d0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
107e0 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
107f0 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
10800 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
10810 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
10820 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
10830 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
10840 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
10850 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10860 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
10870 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
10880 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
10890 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
108a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
108b0 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
108c0 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
108d0 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
108e0 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
108f0 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
10900 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10910 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  ./*.** Call the 
10920 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65  destructor for e
10930 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72  ach auxdata entr
10940 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66  y in pVdbeFunc f
10950 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20  or which.** the 
10960 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
10970 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65  t in mask is cle
10980 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74  ar.  Auxdata ent
10990 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a  ries beyond 31.*
109a0 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73  * are always des
109b0 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74  troyed.  To dest
109c0 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20  roy all auxdata 
109d0 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68  entries, call th
109e0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  is.** routine wi
109f0 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76  th mask==0..*/.v
10a00 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
10a10 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
10a20 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
10a30 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69  , int mask){.  i
10a40 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
10a50 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41   i<pVdbeFunc->nA
10a60 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ux; i++){.    st
10a70 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41  ruct AuxData *pA
10a80 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d  ux = &pVdbeFunc-
10a90 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69  >apAux[i];.    i
10aa0 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61  f( (i>31 || !(ma
10ab0 73 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29  sk&(((u32)1)<<i)
10ac0 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78  )) && pAux->pAux
10ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
10ae0 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
10af0 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
10b00 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
10b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a  pAux->pAux = 0;.
10b30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10b40 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
10b50 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
10b60 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
10b70 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
10b80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
10b90 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
10ba0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
10bb0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
10bc0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
10bd0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
10be0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
10bf0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
10c00 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
10c10 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
10c20 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
10c30 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
10c40 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
10c50 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
10c60 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
10c70 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
10c80 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73  >nVar);.  releas
10c90 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
10ca0 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
10cb0 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
10cc0 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
10cd0 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
10ce0 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
10cf0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
10d00 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
10d10 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
10d20 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
10d30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10d40 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67  >zSql);.  p->mag
10d50 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
10d60 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 44  DEAD;.  sqlite3D
10d70 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
10d80 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ee);.  sqlite3Db
10d90 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
10da0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10db0 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
10dc0 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
10dd0 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
10de0 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
10df0 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
10e00 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
10e10 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
10e20 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
10e30 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
10e40 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
10e50 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
10e60 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
10e70 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
10e80 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
10e90 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
10ea0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
10eb0 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
10ec0 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
10ed0 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
10ee0 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
10ef0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
10f00 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
10f10 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
10f20 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
10f30 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
10f40 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
10f50 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
10f60 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
10f70 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
10f80 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
10f90 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
10fa0 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
10fb0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
10fc0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
10fd0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
10fe0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10ff0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
11000 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
11010 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
11020 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
11030 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
11040 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
11050 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11060 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
11070 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
11080 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
11090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
110a0 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
110b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
110c0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
110d0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
110e0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
110f0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
11100 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
11110 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
11120 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
11130 67 65 74 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  get;.    p->rowi
11140 64 49 73 56 61 6c 69 64 20 3d 20 41 4c 57 41 59  dIsValid = ALWAY
11150 53 28 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b 0a  S(res==0) ?1:0;.
11160 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72 65      if( NEVER(re
11170 73 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63  s<0) ){.      rc
11180 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
11190 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
111a0 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
111b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
111c0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
111d0 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
111e0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
111f0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
11200 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
11210 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63  to = 0;.    p->c
11220 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
11230 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73  HE_STALE;.  }els
11240 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e  e if( ALWAYS(p->
11250 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
11260 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20  int hasMoved;.  
11270 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
11280 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
11290 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
112a0 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20  , &hasMoved);.  
112b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
112c0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61  n rc;.    if( ha
112d0 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20  sMoved ){.      
112e0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
112f0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
11300 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d      p->nullRow =
11310 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
11320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
11340 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
11350 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
11360 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
11370 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
11380 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
11390 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
113a0 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
113b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
113c0 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
113d0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
113e0 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
113f0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
11400 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
11410 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
11420 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
11430 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
11440 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
11450 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
11460 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
11470 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
11480 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
11490 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
114a0 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
114b0 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
114c0 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
114d0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
114e0 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
114f0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
11500 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
11510 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
11520 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
11530 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
11540 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
11550 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
11560 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
11570 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
11580 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
11590 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
115a0 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
115b0 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
115c0 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
115d0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
115e0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
115f0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
11600 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65  d data blob sepe
11610 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
11620 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
11630 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
11640 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
11650 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
11660 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
11670 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
11680 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
11690 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
116a0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
116b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
116c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
116d0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
116f0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
11700 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
11720 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
11730 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
11740 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
11750 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
11760 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
11770 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
117a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
117b0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
117c0 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
117d0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
117e0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
117f0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
11800 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
11810 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
11820 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
11850 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
11860 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
11870 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
11880 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
11890 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
118c0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
118d0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
118f0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
11900 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
11910 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
11940 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
11950 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
11960 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
11970 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
11980 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
11990 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
119a0 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
119b0 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
119c0 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
119d0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
119e0 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
119f0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
11a00 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
11a10 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
11a20 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
11a30 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
11a40 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
11a50 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
11a60 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
11a70 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
11a80 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
11a90 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
11aa0 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
11ab0 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
11ac0 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
11ad0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
11ae0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
11af0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
11b00 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
11b10 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
11b20 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
11b30 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
11b40 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
11b50 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
11b60 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
11b70 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
11b80 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
11b90 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
11ba0 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
11bb0 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
11bc0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11bd0 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d   8+(u32)i;.    }
11be0 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d  .    u = i<0 ? -
11bf0 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75  i : i;.    if( u
11c00 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
11c10 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
11c20 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
11c30 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
11c40 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
11c50 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
11c60 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
11c70 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
11c80 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
11c90 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
11ca0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
11cb0 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
11cc0 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
11cd0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
11ce0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
11cf0 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
11d00 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
11d10 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
11d20 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
11d30 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
11d40 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
11d50 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
11d60 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
11d70 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
11d80 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
11d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11da0 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
11db0 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
11dc0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
11dd0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
11de0 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
11df0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
11e00 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
11e10 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
11e20 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
11e30 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
11e40 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
11e50 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
11e60 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
11e70 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
11e80 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
11e90 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
11ea0 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
11eb0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
11ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
11ed0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
11ee0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
11ef0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
11f00 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
11f10 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
11f20 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
11f30 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
11f40 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
11f50 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
11f60 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
11f70 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
11f80 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
11f90 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
11fa0 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
11fb0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
11fc0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
11fd0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
11fe0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
11ff0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
12000 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
12010 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
12020 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
12030 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
12040 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
12050 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
12060 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
12070 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
12080 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
12090 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
120a0 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
120b0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
120c0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
120d0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
120e0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
120f0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
12100 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
12110 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
12120 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
12130 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
12140 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
12150 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
12160 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
12170 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
12180 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
12190 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
121a0 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
121b0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
121c0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
121d0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
121e0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
121f0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
12200 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
12210 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
12220 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
12230 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
12240 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
12250 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
12260 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
12270 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
12280 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
12290 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
122a0 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
122b0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
122c0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
122d0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
122e0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
122f0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
12300 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
12310 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
12320 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
12330 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
12340 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
12350 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
12360 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
12370 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
12380 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
12390 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
123a0 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
123b0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
123c0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
123d0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
123e0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
123f0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
12400 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
12410 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
12420 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
12430 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
12440 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
12450 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
12460 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
12470 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
12480 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
12490 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
124a0 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
124b0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
124c0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
124d0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
124e0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
124f0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
12500 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
12510 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
12520 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
12530 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
12540 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
12550 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
12560 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
12570 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
12580 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
12590 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
125a0 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
125b0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
125c0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
125d0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
125e0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
125f0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
12600 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
12610 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
12620 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
12630 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
12640 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
12650 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
12660 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
12670 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
12680 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
12690 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
126a0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
126b0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
126c0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
126d0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
126e0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
126f0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
12700 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
12710 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
12720 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
12730 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
12740 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
12750 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20  in buf[].  nBuf 
12760 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a  must always be.*
12770 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
12780 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
12790 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74  e field.  Except
127a0 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69  , if the field i
127b0 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68  s.** a blob with
127c0 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74   a zero-filled t
127d0 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20  ail, then buf[] 
127e0 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68  might be just th
127f0 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20  e right.** size 
12800 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69  to hold everythi
12810 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ng except for th
12820 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
12830 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a  il.  If buf[].**
12840 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f   is only big eno
12850 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
12860 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c  non-zero prefix,
12870 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
12880 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20   that.** prefix 
12890 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74  into buf[].  But
128a0 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72   if buf[] is lar
128b0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
128c0 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72  d both the.** pr
128d0 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69  efix and the tai
128e0 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  l then write the
128f0 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20   prefix and set 
12900 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a  the tail to all.
12910 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20  ** zeros..**.** 
12920 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
12930 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
12940 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
12950 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
12960 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
12970 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
12980 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
12990 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
129a0 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
129b0 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
129c0 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
129d0 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
129e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
129f0 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e  t(u8 *buf, int n
12a00 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Buf, Mem *pMem, 
12a10 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
12a20 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  {.  u32 serial_t
12a30 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
12a40 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d  eSerialType(pMem
12a50 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
12a60 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
12a70 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
12a80 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
12a90 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
12aa0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
12ab0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
12ac0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
12ad0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
12ae0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
12af0 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
12b00 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
12b10 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
12b20 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
12b30 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
12b40 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
12b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12b60 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
12b70 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
12b80 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
12b90 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
12ba0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
12bb0 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32  ssert( len<=(u32
12bc0 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  )nBuf );.    whi
12bd0 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
12be0 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76   buf[i] = (u8)(v
12bf0 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
12c00 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
12c10 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
12c20 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
12c30 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
12c40 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
12c50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
12c60 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
12c70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
12c80 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
12c90 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
12ca0 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
12cb0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
12cc0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
12cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
12ce0 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
12cf0 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
12d00 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
12d10 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
12d20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
12d30 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
12d40 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
12d50 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
12d60 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
12d70 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
12d80 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66   len > (u32)nBuf
12d90 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
12da0 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20  = (u32)nBuf;.   
12db0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
12dc0 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
12dd0 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
12de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
12df0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
12e00 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
12e10 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
12e20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
12e30 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
12e40 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
12e50 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
12e60 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
12e70 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
12e80 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
12e90 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
12ea0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
12eb0 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
12ec0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
12ed0 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
12ee0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
12ef0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
12f00 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
12f10 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
12f20 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
12f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12f40 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
12f50 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
12f60 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f80 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
12f90 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
12fa0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
12fb0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
12fc0 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
12fd0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
12fe0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
12ff0 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
13000 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
13010 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
13020 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
13030 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
13040 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
13050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13060 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
13070 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
13080 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
13090 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
130a0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
130b0 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
130c0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
130d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
130e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
130f0 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
13100 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
13110 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
13120 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
13130 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
13140 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
13150 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
13160 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
13170 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
13180 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
13190 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
131a0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
131b0 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
131c0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
131d0 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
131e0 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
131f0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
13200 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
13210 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
13220 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
13230 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
13240 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
13250 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
13260 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
13270 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
13280 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
13290 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
132a0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
132b0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
132c0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
132d0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
132e0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
132f0 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
13300 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
13310 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
13320 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
13330 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
13340 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
13350 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
13360 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
13370 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
13380 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
13390 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
133a0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
133b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
133c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
133d0 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
133e0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
133f0 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
13400 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
13410 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
13420 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
13430 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
13440 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
13450 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13460 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
13470 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
13480 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
13490 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
134a0 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
134b0 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
134c0 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
134d0 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
134e0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
134f0 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
13500 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
13510 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
13520 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
13530 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
13540 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
13550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
13560 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
13570 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
13580 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
13590 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
135a0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
135b0 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
135c0 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
135d0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
135e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
135f0 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
13600 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
13610 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
13620 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
13630 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
13640 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
13650 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
13660 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
13670 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
13680 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
13690 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
136a0 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
136b0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
136c0 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
136d0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
136e0 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
136f0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
13700 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
13710 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
13720 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
13730 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13740 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
13750 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
13760 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
13770 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
13780 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
13790 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
137a0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
137b0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
137c0 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
137d0 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45  aN(pMem->r) ? ME
137e0 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
137f0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
13800 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
13810 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
13820 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
13830 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
13840 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
13850 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
13860 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
13870 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
13880 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
13890 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
138a0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
138b0 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  {.      u32 len 
138c0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
138d0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
138e0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
138f0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
13900 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
13910 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
13920 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
13930 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
13940 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
13950 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
13960 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
13970 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
13980 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
13990 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
139a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
139b0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
139c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
139d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  }.../*.** Given 
139e0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
139f0 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
13a00 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61  rd in pKey[], pa
13a10 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  rse the.** recor
13a20 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65  d into a Unpacke
13a30 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
13a40 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
13a50 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
13a60 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
13a70 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
13a80 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76  ction might prov
13a90 69 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65  ide szSpace byte
13aa0 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  s of memory.** s
13ab0 70 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20  pace at pSpace. 
13ac0 20 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20   This space can 
13ad0 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  be used to hold 
13ae0 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
13af0 56 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64  VDbeParsedRecord
13b00 20 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74   structure if it
13b10 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
13b20 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e  .  If it is.** n
13b30 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73  ot big enough, s
13b40 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64  pace is obtained
13b50 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
13b60 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lloc()..**.** Th
13b70 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63  e returned struc
13b80 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63  ture should be c
13b90 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20  losed by a call 
13ba0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  to.** sqlite3Vdb
13bb0 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
13bc0 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70  ecord()..*/ .Unp
13bd0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
13be0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
13bf0 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
13c00 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
13c10 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
13c20 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
13c30 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
13c40 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
13c50 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
13c60 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
13c70 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
13c80 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
13c90 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
13ca0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
13cb0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  e,          /* U
13cc0 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
13cd0 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64  vailable to hold
13ce0 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
13cf0 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20   int szSpace    
13d00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
13d10 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
13d20 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ytes */.){.  con
13d30 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
13d40 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
13d50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
13d60 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  pKey;.  Unpacked
13d70 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54  Record *p;  /* T
13d80 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
13d90 72 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  rd that we will 
13da0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
13db0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
13dc0 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
13dd0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70  needed to hold p
13de0 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  , in bytes */.  
13df0 69 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78  int d;.  u32 idx
13e00 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  ;.  u16 u;      
13e10 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
13e20 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
13e30 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
13e40 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
13e50 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
13e60 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
13e70 70 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d  pSpace by this m
13e80 75 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c  uch to 8-byte al
13e90 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f  ign it */.  .  /
13ea0 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74  *.  ** We want t
13eb0 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e  o shift the poin
13ec0 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75  ter pSpace up su
13ed0 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d  ch that it is 8-
13ee0 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20  byte aligned..  
13ef0 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64  ** Thus, we need
13f00 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20   to calculate a 
13f10 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74  value, nOff, bet
13f20 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f  ween 0 and 7, to
13f30 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20   shift .  ** it 
13f40 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69  by.  If pSpace i
13f50 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65  s already 8-byte
13f60 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73   aligned, nOff s
13f70 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20  hould be zero.. 
13f80 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20   */.  nOff = (8 
13f90 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  - (SQLITE_PTR_TO
13fa0 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37  _INT(pSpace) & 7
13fb0 29 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65  )) & 7;.  pSpace
13fc0 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70   += nOff;.  szSp
13fd0 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e  ace -= nOff;.  n
13fe0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
13ff0 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
14000 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
14010 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
14020 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20  Field+1);.  if( 
14030 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b  nByte>szSpace ){
14040 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
14050 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
14060 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
14070 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
14080 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
14090 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
140a0 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55  ED_NEED_FREE | U
140b0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
140c0 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TROY;.  }else{. 
140d0 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
140e0 52 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a  Record*)pSpace;.
140f0 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
14100 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
14110 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  TROY;.  }.  p->p
14120 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
14130 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
14140 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
14150 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65  ld + 1;.  p->aMe
14160 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a  m = pMem = (Mem*
14170 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
14180 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
14190 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
141a0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
141b0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
141c0 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
141d0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
141e0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
141f0 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
14200 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
14210 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
14220 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
14230 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
14240 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
14250 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
14260 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
14270 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
14280 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
14290 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
142a0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
142b0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
142c0 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
142d0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
142e0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
142f0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
14300 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
14310 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
14320 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20  m++;.    u++;.  
14330 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
14340 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
14350 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
14360 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e  ld = u;.  return
14370 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a   (void*)p;.}../*
14380 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14390 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61   destroys a Unpa
143a0 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63  ckedRecord objec
143b0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
143c0 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
143d0 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63  ckedRecord(Unpac
143e0 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
143f0 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70   int i;.  Mem *p
14400 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
14410 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
14420 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ( p->flags & UNP
14430 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
14440 4f 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  OY );.  for(i=0,
14450 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69   pMem=p->aMem; i
14460 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c  <p->nField; i++,
14470 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pMem++){.    /*
14480 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   The unpacked re
14490 63 6f 72 64 20 69 73 20 61 6c 77 61 79 73 20 63  cord is always c
144a0 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
144b0 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
144c0 56 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64  VdbeUnpackRecord
144d0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  () function abov
144e0 65 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61  e, which makes a
144f0 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ll.    ** string
14500 73 20 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74  s and blobs stat
14510 69 63 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  ic.  And none of
14520 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72   the elements ar
14530 65 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72  e.    ** ever tr
14540 61 6e 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68  ansformed, so th
14550 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
14560 74 68 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e  thing to delete.
14570 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14580 4e 45 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c  NEVER(pMem->zMal
14590 6c 6f 63 29 20 29 20 73 71 6c 69 74 65 33 56 64  loc) ) sqlite3Vd
145a0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
145b0 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  m);.  }.  if( p-
145c0 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
145d0 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20  D_NEED_FREE ){. 
145e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
145f0 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  (p->pKeyInfo->db
14600 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
14610 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14620 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
14630 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
14640 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
14650 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
14660 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
14670 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
14680 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
14690 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
146a0 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
146b0 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
146c0 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
146d0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
146e0 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
146f0 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
14700 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
14710 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50  created by th OP
14720 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
14730 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
14740 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
14750 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
14760 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
14770 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
14780 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
14790 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b  eRecord..**.** K
147a0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
147b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
147c0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
147d0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a  ber of fields..*
147e0 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66  * The key with f
147f0 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75  ewer fields is u
14800 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20  sually compares 
14810 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a  less than the .*
14820 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48  * longer key.  H
14830 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e  owever if the UN
14840 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66  PACKED_INCRKEY f
14850 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69  lags in pPKey2 i
14860 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65  s set.** and the
14870 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
14880 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
14890 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
148a0 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69  an key2..** Or i
148b0 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d  f the UNPACKED_M
148c0 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67  ATCH_PREFIX flag
148d0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
148e0 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20  prefixes are.** 
148f0 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20  equal, then the 
14900 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65  keys are conside
14910 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20  red to be equal 
14920 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73  and.** the parts
14930 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d   beyond the comm
14940 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67  on prefix are ig
14950 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
14960 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  the UNPACKED_IGN
14970 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69  ORE_ROWID flag i
14980 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
14990 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20  last byte of.** 
149a0 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b  the header of pK
149b0 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ey1 is ignored. 
149c0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
149d0 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20  hat pKey1 is.** 
149e0 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e  an index key, an
149f0 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74 68  d thus ends with
14a00 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20   a rowid value. 
14a10 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a   The last byte.*
14a20 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  * of the header 
14a30 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62  will therefore b
14a40 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  e the serial typ
14a50 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a  e of the rowid:.
14a60 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20  ** one of 1, 2, 
14a70 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f  3, 4, 5, 6, 8, o
14a80 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65  r 9 - the intege
14a90 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  r serial types..
14aa0 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  ** The serial ty
14ab0 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20  pe of the final 
14ac0 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79  rowid will alway
14ad0 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79  s be a single by
14ae0 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69  te..** By ignori
14af0 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79 74  ng this last byt
14b00 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c  e of the header,
14b10 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f   we force the co
14b20 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69  mparison.** to i
14b30 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20  gnore the rowid 
14b40 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65  at the end of ke
14b50 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y1..*/.int sqlit
14b60 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
14b70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
14b80 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
14b90 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
14ba0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
14bb0 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
14bc0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
14bd0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b   */.){.  int d1;
14be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14bf0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
14c00 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
14c10 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
14c20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f  idx1;          /
14c30 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
14c40 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
14c50 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
14c60 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
14c70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14c80 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
14c90 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
14ca0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
14cb0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
14cc0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14cd0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
14ce0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14cf0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
14d00 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
14d10 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
14d20 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
14d30 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d  >pKeyInfo;.  mem
14d40 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
14d50 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
14d60 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
14d70 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  .  mem1.flags = 
14d80 30 3b 0a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20  0;.  mem1.u.i = 
14d90 30 3b 20 20 2f 2a 20 6e 6f 74 20 6e 65 65 64 65  0;  /* not neede
14da0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
14db0 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
14dc0 69 6e 67 20 2a 2f 0a 20 20 6d 65 6d 31 2e 7a 4d  ing */.  mem1.zM
14dd0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20  alloc = 0;.  .  
14de0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
14df0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
14e00 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
14e10 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
14e20 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
14e30 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b  _IGNORE_ROWID ){
14e40 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20  .    szHdr1--;. 
14e50 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b   }.  nField = pK
14e60 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a  eyInfo->nField;.
14e70 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
14e80 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
14e90 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->nField ){.    
14ea0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
14eb0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
14ec0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
14ed0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
14ee0 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
14ef0 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
14f00 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
14f10 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
14f20 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66  _type1 );.    if
14f30 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
14f40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14f50 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
14f60 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
14f70 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
14f80 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
14f90 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
14fa0 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
14fb0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
14fc0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
14fd0 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
14fe0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
14ff0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
15000 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
15010 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
15020 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
15030 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20  aMem[i],.       
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15050 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70      i<nField ? p
15060 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
15070 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ] : 0);.    if( 
15080 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  rc!=0 ){.      b
15090 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
150a0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  i++;.  }..  /* N
150b0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
150c0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
150d0 20 6f 6e 20 6d 65 6d 31 2e 20 2a 2f 0a 20 20 69   on mem1. */.  i
150e0 66 28 20 4e 45 56 45 52 28 6d 65 6d 31 2e 7a 4d  f( NEVER(mem1.zM
150f0 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69 74 65 33  alloc) ) sqlite3
15100 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
15110 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  mem1);..  /* If 
15120 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43  the PREFIX_SEARC
15130 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  H flag is set an
15140 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63  d all fields exc
15150 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  ept the final.  
15160 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77  ** rowid field w
15170 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  ere equal, then 
15180 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49 58  clear the PREFIX
15190 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64  _SEARCH flag and
151a0 20 73 65 74 20 0a 20 20 2a 2a 20 70 50 4b 65 79   set .  ** pPKey
151b0 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65 20  2->rowid to the 
151c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77  value of the row
151d0 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b 65  id field in (pKe
151e0 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 2a 2a  y1, nKey1)..  **
151f0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
15200 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65   the OP_IsUnique
15210 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
15220 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61  if( (pPKey2->fla
15230 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
15240 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26 20  EFIX_SEARCH) && 
15250 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65  i==(pPKey2->nFie
15260 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 61 73 73  ld-1) ){.    ass
15270 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64 72  ert( idx1==szHdr
15280 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20 61  1 && rc );.    a
15290 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67  ssert( mem1.flag
152a0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
152b0 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73     pPKey2->flags
152c0 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52   &= ~UNPACKED_PR
152d0 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20  EFIX_SEARCH;.   
152e0 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d   pPKey2->rowid =
152f0 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 7d 0a 0a   mem1.u.i;.  }..
15300 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
15310 20 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65     /* rc==0 here
15320 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
15330 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
15340 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
15350 64 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65  d.    ** all the
15360 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
15370 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
15380 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41  ual. If the UNPA
15390 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 20  CKED_INCRKEY.   
153a0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
153b0 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20   then break the 
153c0 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20  tie by treating 
153d0 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a  key2 as larger..
153e0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50      ** If the UP
153f0 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
15400 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CH flag is set, 
15410 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63  then keys with c
15420 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20  ommon prefixes. 
15430 20 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64     ** are consid
15440 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
15450 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
15460 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20  e longer key is 
15470 74 68 65 20 0a 20 20 20 20 2a 2a 20 6c 61 72 67  the .    ** larg
15480 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65  er.  As it happe
15490 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77  ns, the pPKey2 w
154a0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68  ill always be th
154b0 65 20 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a 20  e longer.    ** 
154c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
154d0 66 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2f  fference..    */
154e0 0a 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d  .    if( pPKey2-
154f0 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
15500 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20  D_INCRKEY ){.   
15510 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
15520 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
15530 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
15540 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20  ED_PREFIX_MATCH 
15550 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76  ){.      /* Leav
15560 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d  e rc==0 */.    }
15570 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a  else if( idx1<sz
15580 48 64 72 31 20 29 7b 0a 20 20 20 20 20 20 72 63  Hdr1 ){.      rc
15590 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
155a0 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
155b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
155c0 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  i<pKeyInfo->nFie
155d0 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ld.             
155e0 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61    && pKeyInfo->a
155f0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
15600 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20      rc = -rc;.  
15610 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
15620 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  }. ../*.** pCur 
15630 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
15640 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
15650 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
15660 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
15670 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
15680 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
15690 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
156a0 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
156b0 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
156c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
156d0 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
156e0 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
156f0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
15700 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
15710 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
15720 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
15730 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
15740 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
15750 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
15760 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
15770 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
15780 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
15790 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
157a0 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
157b0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
157c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
157d0 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
157e0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
157f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
15800 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
15810 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
15820 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
15830 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
15840 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
15850 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
15860 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
15870 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
15880 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
15890 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
158a0 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a  METER(db);..  /*
158b0 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
158c0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
158d0 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
158e0 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
158f0 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
15900 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
15910 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
15920 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
15930 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
15940 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
15950 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
15960 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
15970 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
15980 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
15990 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
159a0 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
159b0 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
159c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
159d0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
159e0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
159f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
15a00 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
15a10 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
15a20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
15a30 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20  TE_OK );     /* 
15a40 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
15a50 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
15a60 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
15a70 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b   assert( (nCellK
15a80 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ey & SQLITE_MAX_
15a90 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c  U32)==(u64)nCell
15aa0 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  Key );..  /* Rea
15ab0 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  d in the complet
15ac0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
15ad0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a   index entry */.
15ae0 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20    memset(&m, 0, 
15af0 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63  sizeof(m));.  rc
15b00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
15b10 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
15b20 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
15b30 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
15b40 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
15b50 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
15b60 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
15b70 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
15b80 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
15b90 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
15ba0 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
15bb0 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
15bc0 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
15bd0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
15be0 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
15bf0 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
15c00 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
15c10 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
15c20 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
15c30 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
15c40 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
15c50 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
15c60 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
15c70 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
15c80 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
15c90 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
15ca0 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
15cb0 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
15cc0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
15cd0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
15ce0 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
15cf0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
15d00 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
15d10 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
15d20 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
15d30 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
15d40 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
15d50 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
15d60 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
15d70 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
15d80 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
15d90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
15da0 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
15db0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
15dc0 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
15dd0 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
15de0 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
15df0 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
15e00 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
15e10 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
15e20 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
15e30 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
15e40 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
15e50 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74  (typeRowid);.  t
15e60 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
15e70 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
15e80 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
15e90 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
15ea0 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
15eb0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
15ec0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
15ed0 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
15ee0 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
15ef0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
15f00 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
15f10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15f20 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
15f30 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
15f40 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
15f50 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
15f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
15f70 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
15f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15f90 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
15fa0 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
15fb0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
15fc0 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
15fd0 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
15fe0 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
15ff0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
16000 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16010 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
16020 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
16030 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f  stcase( m.zMallo
16040 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
16050 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
16060 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
16070 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
16080 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
16090 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
160a0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
160b0 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
160c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
160d0 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
160e0 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
160f0 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
16100 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
16110 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
16120 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
16130 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
16140 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
16150 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
16160 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
16170 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
16180 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
16190 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
161a0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
161b0 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
161c0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
161d0 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
161e0 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
161f0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
16200 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
16210 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
16220 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
16230 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
16240 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
16250 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
16260 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
16270 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
16280 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
16290 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
162a0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
162b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
162c0 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64  KeyCompare(.  Vd
162d0 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
162e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
162f0 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
16300 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
16310 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
16320 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55  pUnpacked,  /* U
16330 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
16340 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  of key to compar
16350 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69  e against */.  i
16360 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
16370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
16380 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
16390 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
163a0 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
163b0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
163c0 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
163d0 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
163e0 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
163f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
16400 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
16410 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
16420 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
16430 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
16440 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
16450 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16460 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
16470 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
16480 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
16490 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
164a0 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
164b0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
164c0 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
164d0 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
164e0 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
164f0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
16500 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
16510 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
16520 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
16530 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
16540 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
16550 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
16560 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
16570 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
16580 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20   }.  memset(&m, 
16590 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
165a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
165b0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
165c0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69  ->pCursor, 0, (i
165d0 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
165e0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
165f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
16600 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55    }.  assert( pU
16610 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26  npacked->flags &
16620 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45   UNPACKED_IGNORE
16630 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73  _ROWID );.  *res
16640 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
16650 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
16660 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
16670 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
16680 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
16690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
166a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
166b0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
166c0 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
166d0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
166e0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
166f0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
16700 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
16710 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
16720 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16730 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
16740 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
16750 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
16760 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16770 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
16780 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
16790 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
167a0 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
167b0 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
167c0 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
167d0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
167e0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
167f0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
16800 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
16810 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
16820 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
16830 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
16840 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
16850 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
16860 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
16870 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16880 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
16890 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
168a0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
168b0 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
168c0 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
168d0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
168e0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
168f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
16900 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
16910 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
16920 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
16930 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
16940 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
16950 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
16960 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
16970 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
16980 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
16990 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
169a0 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
169b0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
169c0 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
169d0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
169e0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
169f0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
16a00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
16a10 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
16a20 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
16a30 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
16a40 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
16a50 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
16a60 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
16a70 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
16a80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16a90 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
16aa0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
16ab0 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
16ac0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
16ad0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
16ae0 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
16af0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
16b00 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
16b10 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
16b20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
16b30 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
16b40 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
16b50 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
16b60 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
16b70 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
16b80 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
16b90 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
16ba0 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
16bb0 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
16bc0 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
16bd0 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
16be0 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
16bf0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
16c00 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
16c10 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
16c20 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
16c30 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
16c40 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
16c50 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
16c60 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56  *sqlite3VdbeGetV
16c70 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
16c80 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
16c90 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
16ca0 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
16cb0 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
16cc0 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
16cd0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d  ;.    if( 0==(pM
16ce0 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
16cf0 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  Null) ){.      s
16d00 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
16d10 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  et = sqlite3Valu
16d20 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20  eNew(v->db);.   
16d30 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
16d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16d50 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a  beMemCopy((Mem *
16d60 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20  )pRet, pMem);.  
16d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
16d80 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
16d90 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54  pRet, aff, SQLIT
16da0 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20  E_UTF8);.       
16db0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
16dc0 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29  toreType((Mem *)
16dd0 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pRet);.      }. 
16de0 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
16df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
16e00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
16e10 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
16e20 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
16e30 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
16e40 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
16e50 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
16e60 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
16e70 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
16e80 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
16e90 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
16ea0 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
16eb0 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
16ec0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
16ed0 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
16ee0 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
16ef0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
16f00 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20  if( iVar>32 ){. 
16f10 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20     v->expmask = 
16f20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65  0xffffffff;.  }e
16f30 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d  lse{.    v->expm
16f40 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c  ask |= ((u32)1 <
16f50 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d  < (iVar-1));.  }
16f60 0a 7d 0a                                         .}.