/ Hex Artifact Content
Login

Artifact db3d4eedccea5add714dfb8b10f70d0f8d692db5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
07d0: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
07e0: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
07f0: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0800: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0810: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0820: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0830: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0840: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0850: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0860: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0870: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0880: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0890: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
08a0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08b0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08c0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
08d0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
08e0: 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65  pareV2;.}..#ifde
08f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0900: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0910: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0920: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0930: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0940: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0950: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
0960: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0970: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
0980: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
0990: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74  t it is at least
09a0: 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74   one op larger t
09b0: 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a  han .** it was..
09c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d  **.** If an out-
09d0: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
09e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73  occurs while res
09f0: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c  izing the array,
0a00: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
0a10: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
0a20: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61   case Vdbe.aOp a
0a30: 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63  nd Vdbe.nOpAlloc
0a40: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68   remain .** unch
0a50: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73  anged (this is s
0a60: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64  o that any opcod
0a70: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
0a80: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20  ated can be .** 
0a90: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0aa0: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
0ab0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
0ac0: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   Vdbe)..*/.stati
0ad0: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61  c int growOpArra
0ae0: 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64  y(Vdbe *p){.  Vd
0af0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0b00: 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70  t nNew = (p->nOp
0b10: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
0b20: 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30  loc*2 : (int)(10
0b30: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b  24/sizeof(Op)));
0b40: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0b50: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
0b60: 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  , p->aOp, nNew*s
0b70: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66  izeof(Op));.  if
0b80: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d  ( pNew ){.    p-
0b90: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  >nOpAlloc = sqli
0ba0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0bb0: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a  p->db, pNew)/siz
0bc0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e  eof(Op);.    p->
0bd0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0be0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0bf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0c00: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f  ITE_NOMEM);.}../
0c10: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0c20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0c30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0c40: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0c50: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0c60: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0c70: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0c80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0c90: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0ca0: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0cb0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0cc0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0cd0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0ce0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0cf0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0d00: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0d10: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
0d20: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
0d30: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
0d40: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
0d50: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
0d60: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
0d70: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
0d80: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
0d90: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
0da0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
0db0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
0dc0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0dd0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
0de0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0df0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
0e00: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
0e10: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
0e20: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
0e30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
0e40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
0e50: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
0e60: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
0e70: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0e80: 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70  {.    if( growOp
0e90: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
0ea0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0eb0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0ec0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0ed0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0ee0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
0ef0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
0f00: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
0f10: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
0f20: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
0f30: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
0f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
0f50: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
0f60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
0f70: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
0f80: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
0f90: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
0fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
0fb0: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
0fc0: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69  p[i]);.#endif.#i
0fd0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
0fe0: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
0ff0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1000: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  = 0;.#endif.  re
1010: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71  turn i;.}.int sq
1020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1030: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29  Vdbe *p, int op)
1040: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1050: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1060: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  op, 0, 0, 0);.}.
1070: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1080: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69  ddOp1(Vdbe *p, i
1090: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a  nt op, int p1){.
10a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10b0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
10c0: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  , p1, 0, 0);.}.i
10d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
10e0: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp2(Vdbe *p, in
10f0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1100: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p2){.  return 
1110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1120: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1130: 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   0);.}.../*.** A
1140: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
1150: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
1160: 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69  4 value as a poi
1170: 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
1180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
1190: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
11a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
11b0: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
11c0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11e0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
11f0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
1200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
1210: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1220: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
1230: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
1240: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1260: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
1270: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1280: 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50  zP4,    /* The P
1290: 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  4 operand */.  i
12a0: 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20  nt p4type       
12b0: 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64     /* P4 operand
12c0: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   type */.){.  in
12d0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
12e0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12f0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1300: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1310: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP4(p, addr, zP
1320: 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65  4, p4type);.  re
1330: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1340: 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61  .** Add an OP_Pa
1350: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65  rseSchema opcode
1360: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1370: 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  is broken out fr
1380: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1390: 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20  eAddOp4() since 
13a0: 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f  it needs to also
13b0: 20 6c 6f 63 61 6c 20 61 6c 6c 20 62 74 72 65 65   local all btree
13c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68  s..**.** The zWh
13d0: 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ere string must 
13e0: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
13f0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1400: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69  malloc()..** Thi
1410: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74  s routine will t
1420: 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ake ownership of
1430: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
1440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  emory..*/.void s
1450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1460: 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20  seSchemaOp(Vdbe 
1470: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61  *p, int iDb, cha
1480: 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *zWhere){.  in
1490: 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20  t j;.  int addr 
14a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14b0: 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(p, OP_ParseS
14c0: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
14d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14e0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
14f0: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
1500: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
1510: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
1520: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
1530: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
1540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1550: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1560: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1570: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1580: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1590: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
15a0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
15b0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
15c0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
15d0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15f0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1600: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1610: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1620: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1630: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1640: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1650: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1670: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1680: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
16a0: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
16b0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
16c0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
16d0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
16e0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
16f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1700: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1710: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1720: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1730: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1750: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1760: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1770: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1780: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1790: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
17a0: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
17b0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
17c0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
17d0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
17e0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
17f0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
1800: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1810: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1820: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1830: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1840: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1850: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1860: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1870: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1880: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1890: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
18a0: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
18b0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
18c0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
18d0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
18e0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
18f0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
1900: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1910: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1920: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1930: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1940: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1950: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1960: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1970: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1980: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1990: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
19a0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
19b0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
19c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19d0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
19e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
19f0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
1a00: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1a10: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1a20: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1a30: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1a40: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61    int n = p->nLa
1a50: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  belAlloc*2 + 5;.
1a60: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1a70: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1a80: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1a90: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  n*sizeof(p->aLab
1ad0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e  el[0]));.    p->
1ae0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71  nLabelAlloc = sq
1af0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
1b00: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1b10: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  el)/sizeof(p->aL
1b20: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  abel[0]);.  }.  
1b30: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1b40: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1b50: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1b60: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1b70: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1b80: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1b90: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1ba0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1bb0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
1bc0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
1bd0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
1be0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
1bf0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
1c00: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1c10: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1c20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1c30: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1c40: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1c50: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1c60: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1c70: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1c80: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1c90: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1ca0: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1cb0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1cc0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1cd0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1ce0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1cf0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1d00: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1d10: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1d20: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1d30: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1d40: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1d50: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1d60: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1d70: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1d80: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1d90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1da0: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1db0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1dc0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1dd0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1de0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1df0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1e00: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1e10: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1e20: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1e30: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1e40: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1e50: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1e60: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1e70: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1e80: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1e90: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1ea0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1eb0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1ec0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1ef0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1f00: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1f10: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1f20: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1f30: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1f40: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1f50: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1f60: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1f70: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1f80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1f90: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1fa0: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1fb0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1fc0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1fd0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1fe0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1ff0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
2000: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
2010: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
2020: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
2030: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
2040: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
2050: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2060: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
2070: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
2080: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
2090: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
20a0: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
20b0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
20c0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20e0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
20f0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
2100: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
2110: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
2120: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
2130: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
2140: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
2150: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
2160: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
2170: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
2180: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
2190: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
21a0: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
21b0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
21c0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
21d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
21e0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
21f0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
2200: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
2210: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2220: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2230: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2240: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2250: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2260: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2270: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2280: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2290: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
22a0: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
22b0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
22c0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
22d0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
22e0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
22f0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
2300: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
2310: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2320: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2330: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2340: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2350: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2360: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2370: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2380: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2390: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
23a0: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
23b0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
23c0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
23d0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
23e0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
23f0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
2400: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2410: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2420: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2430: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2440: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2460: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2480: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2490: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
24a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
24b0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
24c0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
24d0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
24e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
24f0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
2500: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2510: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2520: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2530: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2540: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2550: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2560: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2570: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2580: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2590: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
25a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
25b0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
25c0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
25d0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
25e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
25f0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
2600: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2610: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2620: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2630: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2640: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2650: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2660: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2670: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2680: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2690: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
26a0: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
26b0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
26c0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
26d0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
26e0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
26f0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
2700: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2710: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2730: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2740: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2750: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2760: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2770: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2780: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2790: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
27a0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
27b0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
27c0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
27d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
27e0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
27f0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
2800: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2810: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2820: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2830: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2840: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2850: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2860: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2870: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2880: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2890: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
28a0: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
28b0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
28c0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
28d0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
28e0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
28f0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
2900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2910: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2920: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2930: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2940: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2950: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2960: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2970: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2980: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2990: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
29a0: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
29b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
29c0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
29d0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
29e0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
29f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a00: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2a10: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2a20: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
2a30: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2a40: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2a50: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
2a60: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2a70: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2a80: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2a90: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2aa0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
2ab0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
2ac0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
2ad0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
2ae0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
2af0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
2b00: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2b10: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2b20: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
2b30: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
2b40: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
2b50: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
2b60: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
2b70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2b80: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2b90: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2ba0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
2bb0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
2bc0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
2bd0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
2be0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
2bf0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
2c00: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2c10: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2c20: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
2c30: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
2c40: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
2c50: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
2c60: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
2c70: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
2c80: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2c90: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2ca0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2cb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2cc0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2cd0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2ce0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2cf0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2d00: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2d10: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2d20: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
2d30: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
2d40: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
2d50: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
2d60: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
2d70: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
2d80: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2d90: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2da0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2db0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
2dc0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
2dd0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
2de0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
2df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2e00: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
2e10: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
2e20: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
2e30: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
2e40: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
2e50: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
2e60: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
2e70: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
2e80: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f  adOnly = 1;.  fo
2e90: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2ea0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2eb0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2ec0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2ed0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70  ->opcode;..    p
2ee0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71  Op->opflags = sq
2ef0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
2f00: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20  rty[opcode];.   
2f10: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2f20: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
2f30: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
2f40: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2f50: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
2f60: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
2f70: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
2f80: 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61   (opcode==OP_Tra
2f90: 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d  nsaction && pOp-
2fa0: 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64  >p2!=0) || opcod
2fb0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a  e==OP_Vacuum ){.
2fc0: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c        p->readOnl
2fd0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
2fe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2ff0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
3000: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
3010: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20  _VUpdate ){.    
3020: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
3030: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
3040: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
3050: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
3060: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
3070: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
3080: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
3090: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
30a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
30b0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
30c0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
30d0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
30e0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
30f0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
3100: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
3110: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70   }..    if( (pOp
3120: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
3130: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
3140: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
3150: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
3160: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
3170: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
3180: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
3190: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
31a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
31b0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
31c0: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
31d0: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
31e0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
31f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3200: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3210: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3220: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
3230: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3240: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3250: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3260: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3270: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3280: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3290: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
32a0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
32b0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
32c0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
32d0: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
32e0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
32f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
3300: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
3310: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
3320: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3330: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
3340: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
3350: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
3360: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
3370: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
3380: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
3390: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
33a0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
33b0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
33c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
33d0: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
33e0: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
33f0: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
3400: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
3410: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
3420: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
3430: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
3440: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
3450: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
3460: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
3470: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
3480: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
3490: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
34a0: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
34b0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
34c0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
34d0: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
34e0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
34f0: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
3500: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3510: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
3520: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
3530: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
3540: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
3550: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
3560: 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  rt( p->btreeMask
3570: 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  ==0 );..  resolv
3580: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
3590: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
35a0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
35b0: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
35c0: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
35d0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
35e0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
35f0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
3600: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
3610: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
3620: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
3630: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
3640: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
3650: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
3660: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
3670: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
3680: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
3690: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
36a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
36b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
36c0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
36d0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
36e0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
36f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
3700: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
3710: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
3720: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3730: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
3740: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
3750: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3760: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
3770: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
3780: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
3790: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
37a0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
37b0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
37c0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
37d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
37e0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
37f0: 20 69 66 28 20 70 32 3c 30 20 26 26 20 28 73 71   if( p2<0 && (sq
3800: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
3810: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
3820: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
3830: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  =0 ){.        pO
3840: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
3850: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
3860: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3870: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
3880: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
3890: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
38a0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
38b0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
38c0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
38d0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
38e0: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
38f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3900: 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d       pOut->zComm
3910: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ent = 0;.      i
3920: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
3930: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
3940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
3950: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
3960: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
3970: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
3980: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
3990: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
39a0: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
39b0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
39c0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
39d0: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
39e0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
39f0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3a00: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3a10: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3a20: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3a30: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3a40: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3a50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3a60: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3a70: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3a80: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
3a90: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
3aa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3ab0: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
3ac0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
3ad0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3ae0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
3af0: 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69  ( addr>=0 );.  i
3b00: 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29  f( p->nOp>addr )
3b10: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3b20: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p1 = val;.  }
3b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3b40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3b50: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P2 operand for
3b60: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
3b70: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
3b80: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
3b90: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61  ul for setting a
3ba0: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
3bb0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3bc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
3bd0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3be0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3bf0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3c00: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3c10: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3c20: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3c30: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
3c40: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3c50: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3c60: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
3c70: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3c80: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3c90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3ca0: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
3cb0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3cc0: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
3cd0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
3ce0: 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20  rt( addr>=0 );. 
3cf0: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72   if( p->nOp>addr
3d00: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3d10: 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20  ddr].p3 = val;. 
3d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3d30: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3d40: 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66  the P5 operand f
3d50: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
3d60: 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70  ntly.** added op
3d70: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  eration..*/.void
3d80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3d90: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38  geP5(Vdbe *p, u8
3da0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3db0: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   p!=0 );.  if( p
3dc0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->aOp ){.    ass
3dd0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
3de0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
3df0: 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a  Op-1].p5 = val;.
3e00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3e10: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
3e20: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
3e30: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
3e40: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
3e50: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3e60: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3e70: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
3e80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3e90: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
3ea0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
3eb0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
3ec0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
3ed0: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
3ee0: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a  dr, p->nOp);.}..
3ef0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
3f00: 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75  put FuncDef stru
3f10: 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72  cture is ephemer
3f20: 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74  al, then free it
3f30: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e  .  If.** the Fun
3f40: 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65  cDef is not ephe
3f50: 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rmal, then do no
3f60: 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  thing..*/.static
3f70: 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65   void freeEpheme
3f80: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69  ralFunction(sqli
3f90: 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66  te3 *db, FuncDef
3fa0: 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41   *pDef){.  if( A
3fb0: 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28  LWAYS(pDef) && (
3fc0: 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
3fd0: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
3fe0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
3ff0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
4000: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
4010: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4020: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
4030: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
4040: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
4050: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
4060: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
4070: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
4080: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
4090: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
40a0: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61   if( p4 ){.    a
40b0: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20  ssert( db );.   
40c0: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
40d0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
40e0: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
40f0: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
4100: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
4110: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
4120: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
4130: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
4140: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4150: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
4160: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
4170: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
4180: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
41a0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
41b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
41c0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
41d0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
41e0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
41f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4200: 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46     case P4_VDBEF
4210: 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  UNC: {.        V
4220: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
4230: 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a  nc = (VdbeFunc *
4240: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65  )p4;.        fre
4250: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
4260: 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63  on(db, pVdbeFunc
4270: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  ->pFunc);.      
4280: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4290: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
42a0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
42b0: 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20  Data(pVdbeFunc, 
42c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
42d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56  te3DbFree(db, pV
42e0: 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  dbeFunc);.      
42f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4300: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46  .      case P4_F
4310: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
4320: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
4330: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e  unction(db, (Fun
4340: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20  cDef*)p4);.     
4350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4360: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4370: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  MEM: {.        i
4380: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
4390: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
43a0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
43b0: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
43c0: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
43d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
43e0: 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d     Mem *p = (Mem
43f0: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20  *)p4;.          
4400: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4410: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
4420: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4430: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
4440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4460: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54        case P4_VT
4470: 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  AB : {.        i
4480: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
4490: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
44a0: 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62  VtabUnlock((VTab
44b0: 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  le *)p4);.      
44c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
44d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
44e0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61  .** Free the spa
44f0: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
4500: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20   aOp and any p4 
4510: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64  values allocated
4520: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f   for the.** opco
4530: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  des contained wi
4540: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20  thin. If aOp is 
4550: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61  not NULL it is a
4560: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
4570: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65  n .** nOp entrie
4580: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
4590: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
45a0: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ay(sqlite3 *db, 
45b0: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70  Op *aOp, int nOp
45c0: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a  ){.  if( aOp ){.
45d0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
45e0: 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f   for(pOp=aOp; pO
45f0: 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70  p<&aOp[nOp]; pOp
4600: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  ++){.      freeP
4610: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
4620: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23  e, pOp->p4.p);.#
4630: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4640: 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
4650: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
4660: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
4670: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d  f     .    }.  }
4680: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4690: 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a  (db, aOp);.}../*
46a0: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
46b0: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
46c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
46d0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
46e0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
46f0: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
4700: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
4710: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
4720: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
4730: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
4740: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
4750: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
4760: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4770: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
4780: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
4790: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
47a0: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
47b0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
47c0: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
47d0: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
47e0: 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65   Change N opcode
47f0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64  s starting at ad
4800: 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f  dr to No-ops..*/
4810: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4820: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
4830: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
4840: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
4850: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->aOp ){.    Vdb
4860: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
4870: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
4880: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4890: 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  b;.    while( N-
48a0: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
48b0: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
48c0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
48d0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
48e0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
48f0: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
4900: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
4910: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
4920: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
4930: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4940: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
4950: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4960: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4970: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4980: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
4990: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
49a0: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
49b0: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
49c0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
49d0: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
49e0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
49f0: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
4a00: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
4a10: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
4a20: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
4a30: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
4a40: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
4a50: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
4a60: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
4a70: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
4a80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4a90: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
4aa0: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
4ab0: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
4ac0: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
4ad0: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
4ae0: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
4af0: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
4b00: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
4b10: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49   of zP4..**.** I
4b20: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  f n==P4_KEYINFO 
4b30: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
4b40: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
4b50: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
4b60: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
4b70: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
4b80: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4b90: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
4ba0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
4bb0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
4bc0: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
4bd0: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
4be0: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f  lized..** n==P4_
4bf0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
4c00: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
4c10: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P4 points to a K
4c20: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4c30: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
4c40: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
4c50: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
4c60: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4c70: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
4c80: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
4c90: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
4ca0: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
4cb0: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4cc0: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
4cd0: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
4ce0: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
4cf0: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
4d00: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
4d10: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
4d20: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
4d30: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
4d40: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
4d50: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
4d60: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
4d70: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
4d80: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
4d90: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
4da0: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
4db0: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
4dc0: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
4dd0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
4de0: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
4df0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4e00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4e10: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
4e20: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
4e30: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
4e40: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
4e50: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
4e60: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
4e70: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
4e80: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4e90: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4ea0: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  if( p->aOp==0 ||
4eb0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4ec0: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21  d ){.    if ( n!
4ed0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e  =P4_KEYINFO && n
4ee0: 21 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20  !=P4_VTAB ) {.  
4ef0: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e      freeP4(db, n
4f00: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
4f10: 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP4);.    }. 
4f20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4f30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
4f40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
4f50: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
4f60: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
4f70: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
4f80: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  - 1;.  }.  pOp =
4f90: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4fa0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
4fb0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
4fc0: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
4fd0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
4fe0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
4ff0: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
5000: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
5010: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
5020: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
5030: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
5040: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
5050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
5060: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
5070: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
5080: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
5090: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
50a0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
50b0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
50c0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
50d0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
50e0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
50f0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
5100: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
5110: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
5120: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
5130: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
5140: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
5150: 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP4)->nField;. 
5160: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
5170: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
5180: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
5190: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
51a0: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
51b0: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
51c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
51d0: 28 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  (0, nByte);.    
51e0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
51f0: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20   = pKeyInfo;.   
5200: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
5210: 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74  .      u8 *aSort
5220: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
5230: 63 70 79 28 28 63 68 61 72 2a 29 70 4b 65 79 49  cpy((char*)pKeyI
5240: 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 20  nfo, zP4, nByte 
5250: 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  - nField);.     
5260: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
5270: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
5280: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
5290: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
52a0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
52b0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
52c0: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
52d0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
52e0: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
52f0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
5300: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
5310: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
5320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
5330: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
5340: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
5350: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
5360: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
5370: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
5380: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
5390: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
53a0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
53b0: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
53c0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
53d0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
53e0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
53f0: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
5400: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n==P4_VTAB ){.
5410: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5420: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
5430: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5440: 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74  _VTAB;.    sqlit
5450: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62  e3VtabLock((VTab
5460: 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61  le *)zP4);.    a
5470: 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20  ssert( ((VTable 
5480: 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64  *)zP4)->db==p->d
5490: 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  b );.  }else if(
54a0: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
54b0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
54c0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
54d0: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68  ype = (signed ch
54e0: 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ar)n;.  }else{. 
54f0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
5500: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5510: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
5520: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
5530: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
5540: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
5550: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
5560: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
5570: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
5580: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
5590: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65  mment on the the
55a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
55b0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
55c0: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
55d0: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
55e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
55f0: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
5600: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
5610: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
5620: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
5630: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
5640: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
5650: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
5660: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
5670: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5680: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
5690: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
56a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
56b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
56c0: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
56d0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
56e0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
56f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
5700: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
5710: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5720: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
5730: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
5740: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
5750: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
5760: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5770: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
5780: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5790: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
57a0: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
57b0: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
57c0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
57d0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
57e0: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
57f0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
5800: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
5810: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
5820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
5830: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
5840: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70  ist ap;.  if( !p
5850: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
5860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
5870: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73  , OP_Noop);.  as
5880: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
5890: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
58a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
58b0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
58c0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
58d0: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
58e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
58f0: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
5900: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d   char **pz = &p-
5910: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5920: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f  Comment;.    va_
5930: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
5940: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  t);.    sqlite3D
5950: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a  bFree(p->db, *pz
5960: 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c  );.    *pz = sql
5970: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
5980: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
5990: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
59a0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
59b0: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
59c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
59d0: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
59e0: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74  n address.  If t
59f0: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31  he address is -1
5a00: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
5a10: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5a20: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f  ly inserted opco
5a30: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  de..**.** If a m
5a40: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5a50: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
5a60: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  red prior to the
5a70: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73   calling of this
5a80: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  .** routine, the
5a90: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5aa0: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69   dummy VdbeOp wi
5ab0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
5ac0: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20   That opcode.** 
5ad0: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20  is readable but 
5ae0: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
5af0: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20  ough it is cast 
5b00: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61  to a writable va
5b10: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  lue..** The retu
5b20: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70  rn of a dummy op
5b30: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  code allows the 
5b40: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65  call to continue
5b50: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20   functioning.** 
5b60: 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c  after a OOM faul
5b70: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
5b80: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
5b90: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
5ba0: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
5bb0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
5bc0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
5bd0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
5be0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
5bf0: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
5c00: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
5c10: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
5c20: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
5c30: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
5c40: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
5c50: 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75  rind..**.** Abou
5c60: 74 20 74 68 65 20 23 69 66 64 65 66 20 53 51 4c  t the #ifdef SQL
5c70: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20  ITE_OMIT_TRACE: 
5c80: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
5c90: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
5ca0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73   called.** unles
5cb0: 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69  s p->nOp>0.  Thi
5cc0: 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
5cd0: 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53  the absense of S
5ce0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5cf0: 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65  ,.** an OP_Trace
5d00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
5d10: 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64 20  always inserted 
5d20: 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  by sqlite3VdbeGe
5d30: 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a  t() as soon as.*
5d40: 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69 73 20  * a new VDBE is 
5d50: 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20  created.  So we 
5d60: 61 72 65 20 66 72 65 65 20 74 6f 20 73 65 74 20  are free to set 
5d70: 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31  addr to p->nOp-1
5d80: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5d90: 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65  ng to double-che
5da0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
5db0: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
5dc0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  is non-negative.
5dd0: 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54   But.** if SQLIT
5de0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20  E_OMIT_TRACE is 
5df0: 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f  defined, the OP_
5e00: 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64  Trace is omitted
5e10: 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20   and we do need 
5e20: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20  to.** check the 
5e30: 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d  value of p->nOp-
5e40: 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  1 before continu
5e50: 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ing..*/.VdbeOp *
5e60: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5e70: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
5e80: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
5e90: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
5ea0: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
5eb0: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
5ec0: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
5ed0: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
5ee0: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
5ef0: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
5f00: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
5f10: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
5f20: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 64 75 6d  const VdbeOp dum
5f30: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
5f40: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
5f50: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
5f60: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
5f70: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5f80: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5f90: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23   if( addr<0 ){.#
5fa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5fb0: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
5fc0: 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75  p->nOp==0 ) retu
5fd0: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
5fe0: 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  my;.#endif.    a
5ff0: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
6000: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
6010: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
6020: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
6030: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6040: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
6050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
6060: 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65      return (Vdbe
6070: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65  Op*)&dummy;.  }e
6080: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
6090: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
60a0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
60b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
60c0: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
60d0: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
60e0: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
60f0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
6100: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6110: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
6120: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
6130: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
6140: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
6150: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
6160: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
6170: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
6180: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
6190: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
61a0: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
61b0: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
61c0: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
61d0: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
61e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
61f0: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
6200: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
6210: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
6220: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20  YINFO_STATIC:.  
6230: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
6240: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
6250: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
6260: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6270: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
6280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6290: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
62a0: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25  Temp, "keyinfo(%
62b0: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
62c0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
62d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
62e0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
62f0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
6300: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
6310: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
6320: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
6330: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
6340: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
6350: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
6360: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
6370: 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  len30(pColl->zNa
6380: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
6390: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
63a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
63b0: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
63c0: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
63d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
63e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
63f0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6400: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ',';.          i
6410: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
6420: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49  rtOrder && pKeyI
6430: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
6440: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
6450: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6460: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -';.          }.
6470: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6480: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c  (&zTemp[i], pCol
6490: 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20  l->zName,n+1);. 
64a0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b           i += n;
64b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
64c0: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29  f( i+4<nTemp-6 )
64d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
64e0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e  py(&zTemp[i],",n
64f0: 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  il",4);.        
6500: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
6510: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6520: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6530: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
6540: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
6550: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
6560: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6570: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6580: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
6590: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
65a0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
65b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
65c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
65d0: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
65e0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
65f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
6600: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6610: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
6620: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
6630: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
6640: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
6650: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6660: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
6670: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
6680: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
6690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
66a0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
66b0: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
66c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
66d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
66e0: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
66f0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
6700: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6710: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
6720: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6730: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6740: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
6750: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6760: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6770: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
6780: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6790: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
67a0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
67b0: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
67c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
67d0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
67e0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
67f0: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
6800: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d       assert( (pM
6810: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6820: 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Null)==0 );.    
6830: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
6840: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
6850: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
6860: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
6870: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
6880: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
6890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
68a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
68b0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
68c0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
68d0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
68e0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
68f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6900: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6910: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
6920: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
6930: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6940: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
6950: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
6960: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
6970: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
6980: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6990: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
69a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
69b0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
69c0: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
69d0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
69e0: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
69f0: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
6a00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6a10: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6a20: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
6a30: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
6a40: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
6a50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6a60: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
6a70: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
6a80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6a90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6aa0: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
6ab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ac0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
6ad0: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
6ae0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6af0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6b00: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
6b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6b20: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6b30: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
6b40: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
6b50: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
6b60: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
6b70: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
6b80: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6b90: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6ba0: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
6bb0: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
6bc0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
6bd0: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
6be0: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
6bf0: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
6c00: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
6c10: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
6c20: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
6c30: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
6c40: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
6c50: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
6c60: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 74 68  atabases that th
6c70: 65 79 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  ey will be using
6c80: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
6c90: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
6ca0: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
6cb0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 61 6e   p->btreeMask an
6cc0: 64 20 69 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  d is used for lo
6cd0: 63 6b 69 6e 67 20 61 6e 64 20 6f 74 68 65 72 20  cking and other 
6ce0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
6cf0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
6d00: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
6d10: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
6d20: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
6d30: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
6d40: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
6d50: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
6d60: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
6d70: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
6d80: 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  .  p->btreeMask 
6d90: 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  |= ((yDbMask)1)<
6da0: 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  <i;.  if( i!=1 &
6db0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
6dc0: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
6dd0: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
6de0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20   p->lockMask |= 
6df0: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b  ((yDbMask)1)<<i;
6e00: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
6e10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6e20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
6e30: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
6e40: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53  AFE>0./*.** If S
6e50: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
6e60: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
6e70: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
6e80: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
6e90: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
6ea0: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
6eb0: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
6ec0: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
6ed0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
6ee0: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
6ef0: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
6f00: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
6f10: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
6f20: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
6f30: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
6f40: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
6f50: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
6f60: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
6f70: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
6f80: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
6f90: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
6fa0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
6fb0: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
6fc0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
6fd0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
6fe0: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
6ff0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
7000: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
7010: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
7020: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
7030: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
7040: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
7050: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
7060: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
7070: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
7080: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
7090: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
70a0: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
70b0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
70c0: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
70d0: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
70e0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
70f0: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
7100: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
7110: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
7120: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
7130: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
7140: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
7150: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
7160: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
7170: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
7180: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
7190: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
71a0: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
71b0: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
71c0: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
71d0: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
71e0: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
71f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
7200: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
7210: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
7220: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
7230: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
7240: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
7250: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
7260: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
7270: 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b  ;.  yDbMask mask
7280: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
7290: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
72a0: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e  t nDb;.  if( p->
72b0: 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65  lockMask==0 ) re
72c0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
72d0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
72e0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
72f0: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
7300: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
7310: 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  or(i=0, mask=1; 
7320: 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b  i<nDb; i++, mask
7330: 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69   += mask){.    i
7340: 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b  f( i!=1 && (mask
7350: 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21   & p->lockMask)!
7360: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  =0 && ALWAYS(aDb
7370: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
7380: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
7390: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42  eEnter(aDb[i].pB
73a0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
73b0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
73c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
73d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
73e0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
73f0: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  AFE>0./*.** Unlo
7400: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74  ck all of the bt
7410: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20  rees previously 
7420: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c  locked by a call
7430: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
7440: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nter()..*/.void 
7450: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
7460: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7470: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
7480: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
7490: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
74a0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70  int nDb;.  if( p
74b0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20  ->lockMask==0 ) 
74c0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
74d0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
74e0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
74f0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
7500: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
7510: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
7520: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61  ; i<nDb; i++, ma
7530: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20  sk += mask){.   
7540: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61   if( i!=1 && (ma
7550: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  sk & p->lockMask
7560: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61  )!=0 && ALWAYS(a
7570: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
7580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7590: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
75a0: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
75b0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
75c0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
75d0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
75e0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
75f0: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
7600: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
7610: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
7620: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
7630: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
7640: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
7650: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
7660: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
7670: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
7680: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
7690: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
76a0: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
76b0: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
76c0: 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e  d %-4s %.2X %s\n
76d0: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
76e0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
76f0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
7700: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
7710: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
7720: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
7730: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
7740: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
7750: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
7760: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
7770: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
7780: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64  4, pOp->p5,.#ifd
7790: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
77a0: 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d        pOp->zComm
77b0: 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ent ? pOp->zComm
77c0: 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20  ent : "".#else. 
77d0: 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20       "".#endif. 
77e0: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
77f0: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
7800: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
7810: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
7820: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
7830: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
7840: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
7850: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
7860: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
7870: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  End;.    sqlite3
7880: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
7890: 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c    u8 malloc_fail
78a0: 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
78b0: 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64  ailed;.    if( d
78c0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
78d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e  ){.      for(pEn
78e0: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b  d=&p[N]; p<pEnd;
78f0: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   p++){.        s
7900: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7910: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
7920: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
7930: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  rn;.    }.    fo
7940: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
7950: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
7960: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
7970: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
7980: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a  db==p[1].db );..
7990: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
79a0: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
79b0: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
79c0: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
79d0: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
79e0: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
79f0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
7a00: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
7a10: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
7a20: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
7a30: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
7a40: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
7a50: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
7a60: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
7a70: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
7a80: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
7a90: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
7aa0: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
7ab0: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
7ac0: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
7ad0: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
7ae0: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
7af0: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
7b00: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
7b10: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
7b20: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
7b30: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
7b40: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
7b50: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
7b60: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
7b70: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
7b80: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
7b90: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
7ba0: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
7bb0: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
7bc0: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
7bd0: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
7be0: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
7bf0: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
7c00: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
7c10: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
7c20: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
7c30: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
7c40: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
7c50: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
7c60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
7c70: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
7c80: 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  Agg|MEM_Dyn|MEM_
7c90: 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74  Frame|MEM_RowSet
7ca0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
7cb0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
7cc0: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  se(p);.      }el
7cd0: 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f  se if( p->zMallo
7ce0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
7cf0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7d00: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
7d10: 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d      p->zMalloc =
7d20: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
7d30: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
7d40: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  M_Null;.    }.  
7d50: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
7d60: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
7d70: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed;.  }.}../*.**
7d80: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
7d90: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
7da0: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
7db0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
7dc0: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
7dd0: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
7de0: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
7df0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
7e00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7e10: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
7e20: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
7e30: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
7e40: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
7e50: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
7e60: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
7e70: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
7e80: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
7e90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7ea0: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
7eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7ec0: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
7ed0: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
7ee0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
7ef0: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
7f00: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
7f10: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c  DbFree(p->v->db,
7f20: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   p);.}..#ifndef 
7f30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
7f40: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
7f50: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
7f60: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
7f70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
7f80: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
7f90: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
7fa0: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
7fb0: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
7fc0: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
7fd0: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
7fe0: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
7ff0: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
8000: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
8010: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
8020: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
8030: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
8040: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
8050: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
8060: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
8070: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
8080: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
8090: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
80a0: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
80b0: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
80c0: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
80d0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
80e0: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
80f0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
8100: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
8110: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a   QUERY PLAN..**.
8120: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
8130: 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65  in==1, first the
8140: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73   main program is
8150: 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61   listed, then ea
8160: 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69  ch of.** the tri
8170: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
8180: 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20   are listed one 
8190: 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  by one..*/.int s
81a0: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
81b0: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
81d0: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
81e0: 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  int nRow;       
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65       /* Stop whe
8210: 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63  n row count reac
8220: 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  hes this */.  in
8230: 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20  t nSub = 0;     
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8260: 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73  sub-vdbes seen s
8270: 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72  o far */.  SubPr
8280: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20  ogram **apSub = 
8290: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
82a0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d  /* Array of sub-
82b0: 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  vdbes */.  Mem *
82c0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
82f0: 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62  old array of sub
8300: 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  progs */.  sqlit
8310: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
8340: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
8350: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8380: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
8390: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
83c0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
83d0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
83e0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f 2a 20  p->aMem[1];  /* 
83f0: 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73  First Mem of res
8400: 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73  ult set */..  as
8410: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
8420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
8430: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
8440: 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65  IC_RUN );.  asse
8450: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
8460: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
8470: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d  QLITE_BUSY || p-
8480: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
8490: 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20  M );..  /* Even 
84a0: 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f  though this opco
84b0: 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  de does not use 
84c0: 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20  dynamic strings 
84d0: 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73  for.  ** the res
84e0: 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75  ult, result colu
84f0: 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64  mns may become d
8500: 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73  ynamic if the us
8510: 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71  er calls.  ** sq
8520: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
8530: 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61  t16(), causing a
8540: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20   translation to 
8550: 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e  UTF-16 encoding.
8560: 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d  .  */.  releaseM
8570: 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29  emArray(pMem, 8)
8580: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
8590: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
85a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
85b0: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
85c0: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
85d0: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
85e0: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
85f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
8600: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
8610: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
8620: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
8630: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8640: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
8650: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
8660: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
8670: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
8680: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
8690: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
86a0: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
86b0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
86c0: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
86d0: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
86e0: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
86f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
8700: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
8710: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
8720: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
8730: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
8740: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
8750: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
8760: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
8770: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
8780: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
8790: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
87a0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
87b0: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
87c0: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
87d0: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
87e0: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
87f0: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
8800: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
8810: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
8820: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
8830: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
8840: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
8850: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
8860: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
8870: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
8880: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
8890: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
88a0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
88b0: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
88c0: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
88d0: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
88e0: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
88f0: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
8900: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
8910: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
8920: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
8930: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
8940: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
8950: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
8960: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
8970: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
8980: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
8990: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
89a0: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
89b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
89c0: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
89d0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
89e0: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
89f0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
8a00: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
8a10: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
8a20: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
8a30: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
8a40: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
8a50: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
8a60: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
8a70: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
8a80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
8a90: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
8aa0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
8ab0: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
8ac0: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
8ad0: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
8ae0: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
8af0: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
8b00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8b10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
8b20: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
8b30: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
8b40: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
8b50: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
8b60: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
8b70: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8b80: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
8b90: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
8ba0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
8bb0: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
8bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
8bd0: 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70   *z;.    Op *pOp
8be0: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
8bf0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
8c00: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
8c10: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
8c20: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
8c30: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
8c40: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
8c50: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
8c60: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
8c70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8c80: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
8c90: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
8ca0: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
8cb0: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
8cc0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
8cd0: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
8ce0: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
8cf0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
8d00: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
8d10: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8d20: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
8d30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8d40: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
8d50: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
8d60: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
8d70: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
8d80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
8d90: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
8da0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8db0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
8dc0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8dd0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
8de0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e10: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
8e20: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
8e30: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
8e40: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
8e50: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
8e60: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
8e70: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
8e80: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8e90: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
8ea0: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
8eb0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
8ec0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
8ed0: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
8ee0: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
8ef0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
8f00: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
8f10: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
8f20: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
8f30: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
8f40: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
8f50: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
8f60: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
8f70: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
8f80: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
8f90: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
8fa0: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
8fb0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
8fc0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
8fd0: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
8fe0: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
8ff0: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
9000: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
9010: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
9020: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
9030: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
9040: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
9050: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9060: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
9070: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
9080: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
9090: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
90a0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
90b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
90c0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
90d0: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
90e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
90f0: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
9100: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
9110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9120: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
9130: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
9140: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
9150: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20  pSub, nByte, 1) 
9160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
9170: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
9180: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
9190: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
91a0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
91b0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
91c0: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
91d0: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
91e0: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
91f0: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
9200: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
9210: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9220: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
9230: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
9240: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
9250: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
9280: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
9290: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
92a0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
92b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
92c0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
92d0: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
9300: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9310: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
9320: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
9330: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
9340: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
9350: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
9380: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
9390: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
93a0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
93b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
93c0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
93d0: 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20  32, 0) ){       
93e0: 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20       /* P4 */.  
93f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
9400: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9410: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9420: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9430: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c    }.    pMem->fl
9440: 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45  ags = MEM_Dyn|ME
9450: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
9460: 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50      z = displayP
9470: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  4(pOp, pMem->z, 
9480: 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d  32);.    if( z!=
9490: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
94a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
94b0: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d  etStr(pMem, z, -
94c0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
94d0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
94e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
94f0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
9500: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
9510: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
9520: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
9530: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
9540: 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  F8;.    }.    pM
9550: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
9560: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
9570: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
9580: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
9590: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
95a0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
95b0: 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   4, 0) ){.      
95c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
95d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
95e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
95f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9600: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
9610: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
9620: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
9630: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
9640: 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  n = 2;.      sql
9650: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
9660: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
9670: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
9680: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P5 */.      pMe
9690: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
96a0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
96b0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
96c0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
96d0: 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51  ++;.  .#ifdef SQ
96e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
96f0: 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65   if( pOp->zComme
9700: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  nt ){.        pM
9710: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9720: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
9730: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
9740: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  pOp->zComment;. 
9750: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
9760: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
9770: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
9780: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
9790: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
97a0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
97b0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
97c0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
97d0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
97e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
97f0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9810: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20  * Comment */.   
9820: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
9830: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20  = SQLITE_NULL;. 
9840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9850: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
9860: 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c  = 8 - 4*(p->expl
9870: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72  ain-1);.    p->r
9880: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9890: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
98a0: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
98b0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
98c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
98d0: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
98e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
98f0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
9900: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
9910: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
9920: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
9930: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
9940: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
9950: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
9960: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
9970: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  Op;.  if( nOp<1 
9980: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
9990: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
99a0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
99b0: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
99c0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
99d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
99e0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
99f0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
9a00: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
9a10: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
9a20: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
9a30: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
9a40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9a50: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
9a60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9a70: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
9a80: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
9a90: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
9aa0: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
9ab0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9ac0: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
9ad0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
9ae0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
9af0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
9b00: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
9b10: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
9b20: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
9b30: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
9b40: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
9b50: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
9b60: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
9b70: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
9b80: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
9b90: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
9ba0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9bb0: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
9bc0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
9bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
9be0: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
9bf0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
9c00: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
9c10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9c20: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
9c30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
9c40: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
9c50: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
9c60: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
9c70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9c80: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
9c90: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
9ca0: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
9cb0: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
9cc0: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
9cd0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9ce0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
9cf0: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
9d00: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
9d10: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  /../*.** Allocat
9d20: 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66  e space from a f
9d30: 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72  ixed size buffer
9d40: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
9d50: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
9d60: 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75   space.  If insu
9d70: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
9d80: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
9d90: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
9da0: 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74  The pBuf paramet
9db0: 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  er is the initia
9dc0: 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69  l value of a poi
9dd0: 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a  nter which will.
9de0: 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e  ** receive the n
9df0: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66  ew memory.  pBuf
9e00: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c   is normally NUL
9e10: 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e  L.  If pBuf is n
9e20: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d  ot.** NULL, it m
9e30: 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79  eans that memory
9e40: 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61   space has alrea
9e50: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
9e60: 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68  d and that.** th
9e70: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
9e80: 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  d not allocate a
9e90: 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  ny new memory.  
9ea0: 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74  When pBuf is not
9eb0: 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20  .** NULL simply 
9ec0: 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e  return pBuf.  On
9ed0: 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20  ly allocate new 
9ee0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65  memory space whe
9ef0: 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c  n pBuf.** is NUL
9f00: 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69  L..**.** nByte i
9f10: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9f20: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e  bytes of space n
9f30: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70  eeded..**.** *pp
9f40: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61  From points to a
9f50: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61  vailable space a
9f60: 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74  nd pEnd points t
9f70: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
9f80: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70  .** available sp
9f90: 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65  ace.  When space
9fa0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a   is allocated, *
9fb0: 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63  ppFrom is advanc
9fc0: 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65  ed past.** the e
9fd0: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
9fe0: 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ted space..**.**
9ff0: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f   *pnByte is a co
a000: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
a010: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
a020: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
a030: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
a040: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
a050: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
a060: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f   space in *ppFro
a070: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  m to satisfy the
a080: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65  .** request, the
a090: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  n increment *pnB
a0a0: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  yte by the amoun
a0b0: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
a0c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a0d0: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
a0e0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
a0f0: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65       /* Where re
a100: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c  turn pointer wil
a110: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20  l be stored */. 
a120: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
a130: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a140: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
a150: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  cate */.  u8 **p
a160: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f  pFrom,         /
a170: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61  * IN/OUT: Alloca
a180: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20  te from *ppFrom 
a190: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20  */.  u8 *pEnd,  
a1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a1b0: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70  nter to 1 byte p
a1c0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a  ast the end of *
a1d0: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f  ppFrom buffer */
a1e0: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20  .  int *pnByte  
a1f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
a200: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  location cannot 
a210: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65  be made, increme
a220: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b  nt *pnByte */.){
a230: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
a240: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
a250: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  *ppFrom) );.  if
a260: 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20  ( pBuf ) return 
a270: 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20  pBuf;.  nByte = 
a280: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
a290: 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b   if( &(*ppFrom)[
a2a0: 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29  nByte] <= pEnd )
a2b0: 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f  {.    pBuf = (vo
a2c0: 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20  id*)*ppFrom;.   
a2d0: 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74   *ppFrom += nByt
a2e0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
a2f0: 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65  *pnByte += nByte
a300: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
a310: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Buf;.}../*.** Re
a320: 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61  wind the VDBE ba
a330: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
a340: 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69  ing in preparati
a350: 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e  on for.** runnin
a360: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  g it..*/.void sq
a370: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
a380: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65  Vdbe *p){.#if de
a390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
a3a0: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
a3b0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69  DBE_PROFILE).  i
a3c0: 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nt i;.#endif.  a
a3d0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
a3e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
a3f0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
a400: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
a410: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
a420: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
a430: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
a440: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
a450: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
a460: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
a470: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
a480: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20  than later. */. 
a490: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
a4a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66  _MAGIC_RUN;..#if
a4b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a4c0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d  .  for(i=1; i<p-
a4d0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
a4e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
a4f0: 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  [i].db==p->db );
a500: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
a510: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
a520: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a530: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
a540: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
a550: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
a560: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
a570: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
a580: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
a590: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
a5a0: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
a5b0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
a5c0: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
a5d0: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
a5e0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
a5f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
a600: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
a610: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
a620: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
a630: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
a640: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
a650: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
a660: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
a670: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
a680: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
a690: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
a6a0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
a6b0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
a6c0: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
a6d0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
a6e0: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
a6f0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
a700: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
a710: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
a720: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
a730: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
a740: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
a750: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
a760: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
a770: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
a780: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
a790: 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20  lled exact once 
a7a0: 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61  on a each virtua
a7b0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
a7c0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
a7d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
a7e0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
a7f0: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
a800: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
a810: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
a820: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74  e is called, fut
a830: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
a840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a850: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
a860: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
a870: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
a880: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
a890: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
a8a0: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
a8b0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
a8c0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
a8d0: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
a8e0: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
a8f0: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
a900: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
a910: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
a920: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
a930: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
a940: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
a950: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
a960: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
a970: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
a980: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
a990: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
a9a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
a9b0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
a9c0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9e0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
a9f0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa10: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
aa20: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
aa30: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
aa40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
aa50: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
aa60: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
aa70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aa80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
aa90: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
aaa0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
aad0: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
aae0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
aaf0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
ab00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ab10: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
ab20: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
ab30: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
ab40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ab50: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
ab60: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
ab70: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
aba0: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ter */.  u8 *zCs
abb0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
abc0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
abd0: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
abe0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
abf0: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20  u8 *zEnd;       
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac10: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
ac20: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  t allocated memo
ac30: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ry */.  int nByt
ac40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ac50: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
ac60: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  ch extra memory 
ac70: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  is needed */..  
ac80: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
ac90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
aca0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
acb0: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
acc0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
acd0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
ace0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
acf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
ad00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
ad10: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
ad20: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
ad30: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
ad40: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
ad50: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
ad60: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
ad70: 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  Arg;.  .  /* For
ad80: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
ad90: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
ada0: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
adb0: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
adc0: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
add0: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
ade0: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
adf0: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
ae00: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
ae10: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
ae20: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
ae30: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
ae40: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
ae50: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
ae60: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
ae70: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
ae80: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
ae90: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
aea0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
aeb0: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
aec0: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
aed0: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
aee0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
aef0: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
af00: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
af10: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
af20: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
af30: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
af40: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
af50: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
af60: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
af70: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
af80: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
af90: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
afa0: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
afb0: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
afc0: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
afd0: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
afe0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
aff0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
b000: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
b010: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
b020: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
b030: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a  ->nOpAlloc];  /*
b040: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
b050: 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a   end of zCsr[] *
b060: 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  /..  resolveP2Va
b070: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
b080: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
b090: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
b0a0: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
b0b0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
b0c0: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
b0d0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
b0e0: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
b0f0: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
b100: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
b110: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43  zEnd-zCsr);.  zC
b120: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75  sr += (zCsr - (u
b130: 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72  8*)0)&7;.  asser
b140: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
b150: 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b  IGNMENT(zCsr) );
b160: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
b170: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
b180: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
b190: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
b1a0: 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70  ed in two.  ** p
b1b0: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
b1c0: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
b1d0: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
b1e0: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a  d space at the .
b1f0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
b200: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
b210: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
b220: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
b230: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
b240: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
b250: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
b260: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
b270: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
b280: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
b290: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
b2a0: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
b2b0: 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  on.  .  **.  ** 
b2c0: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70  This two-pass ap
b2d0: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73  proach that reus
b2e0: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  es as much memor
b2f0: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
b300: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74  om.  ** the left
b310: 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68  over space at th
b320: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
b330: 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69  ode array can si
b340: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
b350: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
b360: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
b370: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
b380: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
b390: 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65    do {.    nByte
b3a0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
b3b0: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
b3c0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
b3d0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
b3e0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b3f0: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
b400: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72  locSpace(p->aVar
b410: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
b420: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
b430: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
b440: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
b450: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
b460: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
b470: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b480: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  Byte);.    p->az
b490: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
b4a0: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a  (p->azVar, nVar*
b4b0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26  sizeof(char*), &
b4c0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
b4d0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  te);.    p->apCs
b4e0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
b4f0: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
b500: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
b510: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or*),.          
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b540: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  yte);.    if( nB
b550: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  yte ){.      p->
b560: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
b570: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
b580: 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
b590: 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65    zCsr = p->pFre
b5a0: 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a  e;.    zEnd = &z
b5b0: 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77  Csr[nByte];.  }w
b5c0: 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21  hile( nByte && !
b5d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b5e0: 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f   );..  p->nCurso
b5f0: 72 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72  r = (u16)nCursor
b600: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20  ;.  if( p->aVar 
b610: 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  ){.    p->nVar =
b620: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
b630: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
b640: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; n++){.      p
b650: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
b660: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
b670: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
b680: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
b690: 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 29    if( p->azVar )
b6a0: 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d  {.    p->nzVar =
b6b0: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a   pParse->nzVar;.
b6c0: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a      memcpy(p->az
b6d0: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  Var, pParse->azV
b6e0: 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a  ar, p->nzVar*siz
b6f0: 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29  eof(p->azVar[0])
b700: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
b710: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20  arse->azVar, 0, 
b720: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69  pParse->nzVar*si
b730: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56  zeof(pParse->azV
b740: 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  ar[0]));.  }.  i
b750: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
b760: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20    p->aMem--;    
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
b790: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
b7a0: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e  .    p->nMem = n
b7b0: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
b7c0: 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f       /*       no
b7d0: 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31  t from 0..nMem-1
b7e0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b   */.    for(n=1;
b7f0: 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a   n<=nMem; n++){.
b800: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
b810: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
b820: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  l;.      p->aMem
b830: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
b840: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c   }.  }.  p->expl
b850: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
b860: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
b870: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
b880: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
b890: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
b8a0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
b8b0: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
b8c0: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
b8d0: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
b8e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
b8f0: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
b900: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
b910: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
b920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
b930: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
b940: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
b950: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
b960: 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68  >pBt);.    /* Th
b970: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77  e pCx->pCursor w
b980: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74  ill be close aut
b990: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69  omatically, if i
b9a0: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20  t exists, by.   
b9b0: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
b9c0: 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ve. */.  }else i
b9d0: 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  f( pCx->pCursor 
b9e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
b9f0: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
ba00: 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
ba10: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
ba20: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
ba30: 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56  LE.  if( pCx->pV
ba40: 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  tabCursor ){.   
ba50: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
ba60: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
ba70: 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75  r = pCx->pVtabCu
ba80: 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  rsor;.    const 
ba90: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
baa0: 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70  pModule = pCx->p
bab0: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
bac0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
bad0: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
bae0: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
baf0: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
bb00: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
bb10: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
bb20: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
bb30: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
bb40: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
bb50: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
bb60: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
bb70: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
bb80: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
bb90: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
bba0: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
bbb0: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
bbc0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
bbd0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
bbe0: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
bbf0: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
bc00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
bc10: 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70 20  me->v;.  v->aOp 
bc20: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20  = pFrame->aOp;. 
bc30: 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65   v->nOp = pFrame
bc40: 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d  ->nOp;.  v->aMem
bc50: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b   = pFrame->aMem;
bc60: 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72  .  v->nMem = pFr
bc70: 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->nMem;.  v->
bc80: 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e  apCsr = pFrame->
bc90: 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72  apCsr;.  v->nCur
bca0: 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  sor = pFrame->nC
bcb0: 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e  ursor;.  v->db->
bcc0: 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61  lastRowid = pFra
bcd0: 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  me->lastRowid;. 
bce0: 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46   v->nChange = pF
bcf0: 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  rame->nChange;. 
bd00: 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e   return pFrame->
bd10: 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  pc;.}../*.** Clo
bd20: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  se all cursors..
bd30: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61  **.** Also relea
bd40: 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d  se any dynamic m
bd50: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
bd60: 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65  e VM in the Vdbe
bd70: 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a  .aMem memory .**
bd80: 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69   cell array. Thi
bd90: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61  s is necessary a
bda0: 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  s the memory cel
bdb0: 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74  l array may cont
bdc0: 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20  ain.** pointers 
bdd0: 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  to VdbeFrame obj
bde0: 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ects, which may 
bdf0: 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20  in turn contain 
be00: 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f  pointers to.** o
be10: 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  pen cursors..*/.
be20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
be30: 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65  eAllCursors(Vdbe
be40: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
be50: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
be60: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
be70: 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
be80: 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
be90: 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
bea0: 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
beb0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
bec0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
bed0: 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  pFrame);.  }.  p
bee0: 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->pFrame = 0;.  
bef0: 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a  p->nFrame = 0;..
bf00: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
bf10: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
bf20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
bf30: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Cursor; i++){.  
bf40: 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a      VdbeCursor *
bf50: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
bf60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29  ;.      if( pC )
bf70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bf80: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
bf90: 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20  p, pC);.        
bfa0: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
bfb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bfc0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d   }.  if( p->aMem
bfd0: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
bfe0: 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d  emArray(&p->aMem
bff0: 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  [1], p->nMem);. 
c000: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
c010: 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  DelFrame ){.    
c020: 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20  VdbeFrame *pDel 
c030: 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  = p->pDelFrame;.
c040: 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65      p->pDelFrame
c050: 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74   = pDel->pParent
c060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c070: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65  eFrameDelete(pDe
c080: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
c090: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
c0a0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
c0b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c0c0: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
c0d0: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
c0e0: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
c0f0: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
c100: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
c110: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
c120: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
c130: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
c140: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
c150: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
c160: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
c170: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
c180: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c190: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
c1a0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63  _DEBUG.  /* Exec
c1b0: 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ute assert() sta
c1c0: 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
c1d0: 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e  e that the Vdbe.
c1e0: 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a  apCsr[] and .  *
c1f0: 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72  * Vdbe.aMem[] ar
c200: 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64  rays have alread
c210: 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75  y been cleaned u
c220: 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  p.  */.  int i;.
c230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c240: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
c250: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d  sert( p->apCsr==
c260: 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d  0 || p->apCsr[i]
c270: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31  ==0 );.  for(i=1
c280: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  ; i<=p->nMem; i+
c290: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
c2a0: 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d  em==0 || p->aMem
c2b0: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e  [i].flags==MEM_N
c2c0: 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ull );.#endif.. 
c2d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c2e0: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
c2f0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
c300: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
c310: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
c320: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
c330: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
c340: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
c350: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
c360: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
c370: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
c380: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
c390: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
c3a0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
c3b0: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
c3c0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
c3d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
c3e0: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
c3f0: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
c400: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
c410: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
c420: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c430: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
c440: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
c450: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
c460: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
c470: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
c480: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
c490: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
c4a0: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
c4b0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
c4c0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
c4d0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
c4e0: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
c4f0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
c500: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
c510: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
c520: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
c530: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
c540: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
c550: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c560: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
c570: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
c580: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c590: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
c5a0: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
c5b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c5c0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
c5d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
c5e0: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
c5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
c600: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
c610: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
c620: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
c630: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
c640: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
c650: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c660: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
c670: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
c680: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
c690: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
c6a0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
c6b0: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
c6c0: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
c6d0: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
c6e0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
c6f0: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
c700: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
c710: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
c720: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
c730: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
c740: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
c750: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
c760: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
c770: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
c780: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
c790: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
c7a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c7b0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
c7c0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
c7f0: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
c800: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c820: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
c830: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
c840: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
c850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
c870: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
c880: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
c890: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
c8a0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
c8b0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
c8c0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
c8d0: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
c8e0: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c900: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
c910: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
c920: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
c930: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
c940: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
c950: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
c960: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
c970: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
c980: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
c990: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c9a0: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
c9b0: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
c9c0: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
c9d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
c9e0: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
c9f0: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
ca00: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
ca10: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
ca20: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
ca30: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
ca40: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
ca50: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
ca60: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
ca70: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
ca80: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
ca90: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
caa0: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
cab0: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
cac0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cad0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
cae0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
caf0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
cb00: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
cb10: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
cb20: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
cb30: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
cb40: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
cb50: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
cb60: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
cb70: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
cb80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cb90: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
cba0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
cbb0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cbc0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
cbd0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
cbe0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
cbf0: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
cc00: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
cc10: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
cc20: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
cc30: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
cc40: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
cc50: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
cc60: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
cc70: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
cc80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
cc90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
cca0: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
ccb0: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
ccc0: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
ccd0: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
cce0: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
ccf0: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
cd00: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
cd10: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
cd20: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
cd30: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
cd40: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
cd50: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
cd60: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
cd70: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
cd80: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
cd90: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
cda0: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
cdb0: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
cdc0: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
cdd0: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
cde0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
cdf0: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
ce00: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
ce10: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
ce20: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
ce30: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
ce40: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
ce50: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
ce60: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d  VtabSync(db, &p-
ce70: 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a  >zErrMsg);..  /*
ce80: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
ce90: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
cea0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
ceb0: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
cec0: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
ced0: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
cee0: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
cef0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
cf00: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
cf10: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
cf20: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
cf30: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
cf40: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
cf50: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
cf60: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
cf70: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
cf80: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
cf90: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
cfa0: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
cfb0: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
cfc0: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
cfd0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
cfe0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
cff0: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
d000: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d010: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
d020: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
d030: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
d040: 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20      needXcommit 
d050: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
d060: 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a  !=1 ) nTrans++;.
d070: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d080: 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
d090: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65  Lock(sqlite3Btre
d0a0: 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
d0b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
d0c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d0d0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d0e0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
d0f0: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
d100: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
d110: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
d120: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
d130: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
d140: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
d150: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63  llback ){.    rc
d160: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
d170: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
d180: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  itArg);.    if( 
d190: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
d1a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
d1b0: 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  AINT;.    }.  }.
d1c0: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
d1d0: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
d1e0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
d1f0: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
d200: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
d210: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
d220: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
d230: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
d240: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
d250: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
d260: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
d270: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
d280: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
d290: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
d2a0: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
d2b0: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
d2c0: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
d2d0: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
d2e0: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
d2f0: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
d300: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
d310: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
d320: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
d330: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
d340: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
d350: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
d360: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
d370: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
d380: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
d390: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
d3a0: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
d3b0: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
d3c0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d3d0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d3e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
d3f0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
d400: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
d410: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
d420: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d430: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
d440: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
d450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d460: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
d470: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
d480: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
d490: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
d4a0: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
d4b0: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
d4c0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
d4d0: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
d4e0: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
d4f0: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
d500: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
d510: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
d520: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
d530: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
d540: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
d550: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
d560: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
d570: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
d580: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
d590: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
d5a0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
d5b0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
d5c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
d5d0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d5e0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
d5f0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
d600: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
d610: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
d620: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
d630: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
d640: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
d660: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
d670: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d680: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
d690: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
d6a0: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
d6b0: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
d6c0: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
d6d0: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
d6e0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
d6f0: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
d700: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
d710: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
d720: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
d730: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
d740: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
d750: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
d760: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
d770: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
d780: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
d790: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
d7a0: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
d7b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
d7c0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
d7d0: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
d7e0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
d7f0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
d800: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
d810: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
d820: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
d830: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
d840: 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  res;..    /* Sel
d850: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
d860: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
d870: 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
d880: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
d890: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d8a0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
d8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
d8c0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
d8d0: 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
d8e0: 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74  om);.      zMast
d8f0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
d900: 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30  ntf(db, "%s-mj%0
d910: 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20  8X", zMainFile, 
d920: 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66  iRandom&0x7fffff
d930: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ff);.      if( !
d940: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  zMaster ){.     
d950: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d960: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
d970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c        sqlite3Fil
d980: 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69  eSuffix3(zMainFi
d990: 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  le, zMaster);.  
d9a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d9b0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
d9c0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
d9d0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
d9e0: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
d9f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
da00: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
da10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
da20: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
da30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
da40: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
da50: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
da60: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
da70: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
da80: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
da90: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
daa0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
dab0: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
dac0: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
dad0: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
dae0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
daf0: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
db00: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
db10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
db20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
db30: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
db40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
db50: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
db60: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
db70: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
db80: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
db90: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
dba0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
dbb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
dbc0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
dbd0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
dbe0: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
dbf0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
dc00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
dc10: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
dc20: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
dc30: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
dc40: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
dc50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
dc60: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
dc70: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
dc80: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
dc90: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
dca0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
dcb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
dcc0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
dcd0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
dce0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
dcf0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
dd00: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
dd10: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
dd20: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
dd30: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
dd40: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
dd50: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
dd60: 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( zFile==0 ){.  
dd70: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
dd80: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d  ;  /* Ignore TEM
dd90: 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64  P and :memory: d
dda0: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
ddb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
ddc0: 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d  sert( zFile[0]!=
ddd0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
dde0: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
ddf0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
de00: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
de10: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
de20: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
de30: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
de40: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
de50: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
de60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
de70: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
de80: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
de90: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
dea0: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
deb0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
dec0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ded0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
dee0: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
def0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
df00: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
df10: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
df20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
df30: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
df40: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
df50: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
df60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
df70: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
df80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
df90: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
dfa0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
dfb0: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
dfc0: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
dfd0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
dfe0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
dff0: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
e000: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
e010: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e020: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
e030: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
e040: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
e050: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
e060: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
e070: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
e080: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
e090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
e0a0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
e0b0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
e0c0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
e0d0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
e0e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e0f0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
e100: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e110: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
e120: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
e130: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
e140: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
e150: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
e160: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
e170: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
e180: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
e190: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
e1a0: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
e1b0: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
e1c0: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
e1d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e1e0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
e1f0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
e200: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
e210: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
e220: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
e230: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e240: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
e250: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
e260: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
e270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e280: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
e290: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
e2a0: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
e2b0: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
e2c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e2d0: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
e2e0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
e2f0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
e300: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
e310: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
e320: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
e330: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e340: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
e350: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
e360: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
e370: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
e380: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
e390: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e3a0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e3b0: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
e3c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
e3e0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
e3f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
e400: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  !=SQLITE_BUSY );
e410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
e420: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e430: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e440: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e460: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74   }..    /* Delet
e470: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
e480: 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
e490: 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e  commits the tran
e4a0: 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20  saction. After. 
e4b0: 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73     ** doing this
e4c0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
e4d0: 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62  s synced again b
e4e0: 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69  efore any indivi
e4f0: 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e  dual.    ** tran
e500: 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72  saction files ar
e510: 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
e520: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
e530: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
e540: 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20   zMaster, 1);.  
e550: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e560: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e570: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
e580: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e590: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e5a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
e5b0: 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
e5c0: 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
e5d0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
e5e0: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
e5f0: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
e600: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
e610: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
e620: 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
e630: 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
e640: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
e650: 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
e660: 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
e670: 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
e680: 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
e690: 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
e6a0: 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
e6b0: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
e6c0: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
e6d0: 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
e6e0: 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
e6f0: 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
e700: 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
e710: 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
e720: 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
e730: 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
e740: 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
e750: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
e760: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
e770: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
e780: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
e790: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
e7a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e7b0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
e7c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e7d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e7e0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
e7f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e800: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e810: 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20  Two(pBt, 1);.   
e820: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
e830: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
e840: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
e850: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
e860: 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
e870: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
e880: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
e890: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
e8a0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
e8b0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
e8c0: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  at the sqlite3.a
e8d0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75  ctiveVdbeCnt cou
e8e0: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
e8f0: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
e900: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
e910: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
e920: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
e930: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
e940: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
e950: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
e960: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
e970: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
e980: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
e990: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
e9a0: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
e9b0: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
e9c0: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
e9d0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
e9e0: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
e9f0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
ea00: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
ea10: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
ea20: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
ea30: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
ea40: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
ea50: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
ea60: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
ea70: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
ea80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
ea90: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
eaa0: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
eab0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
eac0: 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
ead0: 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
eae0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
eaf0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
eb00: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
eb10: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
eb20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
eb30: 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64  ite==db->writeVd
eb40: 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65  beCnt );.}.#else
eb50: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
eb60: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
eb70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
eb80: 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61   every Btree tha
eb90: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  t in database co
eba0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63  nnection db whic
ebb0: 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  h .** has been m
ebc0: 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20  odified, "trip" 
ebd0: 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61  or invalidate ea
ebe0: 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20  ch cursor in.** 
ebf0: 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74  that Btree might
ec00: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
ec10: 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ied so that the 
ec20: 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65  cursor.** can ne
ec30: 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69  ver be used agai
ec40: 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  n.  This happens
ec50: 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
ec60: 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65  .*** occurs.  We
ec70: 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c   have to trip al
ec80: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73  l the other curs
ec90: 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72  ors, even.** cur
eca0: 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56  sor from other V
ecb0: 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  Ms in different 
ecc0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ecd0: 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74  ions,.** so that
ece0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72   none of them tr
ecf0: 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74  y to use the dat
ed00: 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a  a at which they.
ed10: 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67  ** were pointing
ed20: 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d   and which now m
ed30: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61  ay have been cha
ed40: 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74  nged due.** to t
ed50: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
ed60: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74  ** Remember that
ed70: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20   a rollback can 
ed80: 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f  delete tables co
ed90: 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65  mplete and.** re
eda0: 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e  order rootpages.
edb0: 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73    So it is not s
edc0: 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74  ufficient just t
edd0: 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74  o save.** the st
ede0: 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
edf0: 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  r.  We have to i
ee00: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75  nvalidate the cu
ee10: 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20  rsor.** so that 
ee20: 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  it is never used
ee30: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   again..*/.stati
ee40: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
ee50: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
ee60: 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33  edBtrees(sqlite3
ee70: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
ee80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
ee90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
eea0: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
eeb0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
eec0: 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42  f( p && sqlite3B
eed0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
eee0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
eef0: 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
ef00: 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41  sors(p, SQLITE_A
ef10: 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  BORT);.    }.  }
ef20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
ef30: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
ef40: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
ef50: 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
ef60: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
ef70: 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
ef80: 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
ef90: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
efa0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
efb0: 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
efc0: 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
efd0: 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
efe0: 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
eff0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
f000: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
f010: 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
f020: 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
f030: 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
f040: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
f050: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
f060: 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mmtted..**.** If
f070: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
f080: 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
f090: 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
f0a0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
f0b0: 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
f0c0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
f0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
f0e0: 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
f0f0: 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
f100: 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
f110: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
f120: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f130: 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
f140: 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
f150: 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
f160: 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
f170: 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
f180: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f190: 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
f1a0: 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
f1b0: 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
f1c0: 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
f1d0: 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
f1e0: 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73  ve occured, caus
f1f0: 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  ing an emergency
f200: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20   rollback..  ** 
f210: 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62  In this case (db
f220: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29  ->nStatement==0)
f230: 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
f240: 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20  othing to do..  
f250: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74  */.  if( db->nSt
f260: 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
f270: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
f280: 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
f290: 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
f2a0: 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
f2b0: 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
f2c0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f2d0: 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
f2e0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f2f0: 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
f300: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
f310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f320: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
f330: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
f340: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
f350: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
f360: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f370: 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20   .      int rc2 
f380: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f390: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
f3a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
f3b0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
f3c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
f3d0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
f3e0: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
f3f0: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
f400: 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
f410: 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
f420: 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
f430: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
f440: 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
f450: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f460: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
f470: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
f480: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
f490: 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
f4a0: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
f4b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
f4c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f4d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
f4e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f4f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
f500: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
f510: 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
f520: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
f530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f540: 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  .      if( eOp==
f550: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f560: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
f570: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
f580: 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
f590: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
f5a0: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
f5b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
f5c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f5d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f5e0: 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
f5f0: 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
f600: 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
f610: 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
f620: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
f630: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
f640: 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
f650: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  g rolled back, a
f660: 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20  lso restore the 
f670: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
f680: 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
f690: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
f6a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
f6b0: 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
f6c0: 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
f6d0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
f6e0: 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
f6f0: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
f700: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f710: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  ){.      db->nDe
f720: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
f730: 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
f740: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f750: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f760: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
f770: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
f780: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
f790: 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
f7a0: 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
f7b0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
f7c0: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
f7d0: 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
f7e0: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
f7f0: 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
f800: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
f810: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
f820: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
f830: 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
f840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
f850: 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
f860: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
f870: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
f880: 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
f890: 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
f8a0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
f8b0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
f8c0: 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
f8d0: 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
f8e0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
f8f0: 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20  and write.** an 
f900: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
f910: 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e   it. Then return
f920: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
f930: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f940: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
f950: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  Y.int sqlite3Vdb
f960: 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70  eCheckFk(Vdbe *p
f970: 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b  , int deferred){
f980: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f990: 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64   p->db;.  if( (d
f9a0: 65 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e  eferred && db->n
f9b0: 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20  DeferredCons>0) 
f9c0: 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
f9d0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
f9e0: 74 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72  t>0) ){.    p->r
f9f0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
fa00: 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72  RAINT;.    p->er
fa10: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
fa20: 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
fa30: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
fa40: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72  ErrMsg, db, "for
fa50: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
fa60: 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
fa70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fa80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
fa90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
faa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
fab0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
fac0: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
fad0: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
fae0: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
faf0: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
fb00: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
fb10: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
fb20: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
fb30: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
fb40: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
fb50: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
fb60: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
fb70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fb80: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
fb90: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
fba0: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
fbb0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
fbc0: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
fbd0: 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
fbe0: 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
fbf0: 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
fc00: 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
fc10: 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
fc20: 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
fc30: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
fc40: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
fc50: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
fc60: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
fc70: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
fc80: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
fc90: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
fca0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
fcb0: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
fcc0: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
fcd0: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
fce0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
fcf0: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
fd00: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
fd10: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
fd20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
fd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
fd40: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
fd50: 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
fd60: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
fd70: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
fd80: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
fd90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
fda0: 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
fdb0: 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
fdc0: 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
fdd0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
fde0: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
fdf0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
fe00: 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
fe10: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
fe20: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
fe30: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
fe40: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
fe50: 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
fe60: 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
fe70: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
fe80: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
fe90: 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
fea0: 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
feb0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
fec0: 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
fed0: 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
fee0: 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
fef0: 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
ff00: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
ff10: 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
ff20: 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
ff30: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
ff40: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
ff50: 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
ff60: 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
ff70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
ff80: 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
ff90: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
ffa0: 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
ffb0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ffc0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
ffd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ffe0: 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
fff0: 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
10000 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
10010 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
10020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10030 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
10040 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
10050 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
10060 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
10070 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
10080 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a   never started *
10090 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
100a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
100b0 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
100c0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
100d0 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
100e0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
100f0 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
10100 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
10110 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
10120 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
10130 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
10140 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
10150 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
10160 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
10170 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
10180 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
10190 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
101a0 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
101b0 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
101c0 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
101d0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
101e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
101f0 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  KED );  /* This 
10200 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20  error no longer 
10210 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73  exists */.    is
10220 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
10230 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
10240 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
10250 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
10260 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
10270 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
10280 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
10290 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
102a0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
102b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
102c0 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
102d0 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
102e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
102f0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
10300 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
10310 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
10320 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
10330 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
10340 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
10350 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
10360 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
10370 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
10380 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
10390 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
103a0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
103b0 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
103c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
103d0 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
103e0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
103f0 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
10400 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
10410 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
10420 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
10430 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
10440 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68     ** occured wh
10450 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
10460 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
10470 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
10480 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
10490 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
104a0 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
104b0 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
104c0 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
104d0 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
104e0 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
104f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
10500 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
10510 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
10520 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
10530 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
10540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
10550 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
10560 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
10570 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
10580 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
10590 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
105a0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
105b0 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
105c0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
105d0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
105e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
105f0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
10600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
10610 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
10620 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
10630 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
10640 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
10650 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
10660 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
10670 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
10680 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
10690 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
106a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
106b0 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
106c0 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
106d0 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
106e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
106f0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
10700 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10710 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
10720 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
10730 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
10740 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
10750 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
10760 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
10770 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
10780 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
10790 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
107a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
107b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
107c0 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
107d0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
107e0 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
107f0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
10800 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
10810 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
10820 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
10830 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
10840 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
10850 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
10860 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
10870 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
10880 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
10890 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
108a0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
108b0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
108c0 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
108d0 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
108e0 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
108f0 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
10900 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
10910 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
10920 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  & db->writeVdbeC
10930 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  nt==(p->readOnly
10940 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ==0) .    ){.   
10950 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10960 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
10970 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
10980 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
10990 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
109a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
109b0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
109c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
109d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
109e0 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
109f0 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ER(p->readOnly) 
10a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
10a10 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
10a20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
10a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
10a40 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
10a50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10a60 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
10a70 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
10a80 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  { .          /* 
10a90 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
10aa0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
10ab0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
10ac0 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
10ad0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68           ** or h
10ae0 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
10af0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
10b00 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65  here are no defe
10b10 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20  rred foreign.   
10b20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f         ** key co
10b30 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c  nstraints to hol
10b40 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  d up the transac
10b50 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
10b60 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
10b70 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
10b80 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
10b90 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
10ba0 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
10bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
10bd0 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  && p->readOnly )
10be0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10bf0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
10c00 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
10c10 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
10c20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10c30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10c40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
10c50 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
10c60 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10c70 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10c90 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
10ca0 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
10cb0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
10cc0 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
10cd0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
10ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10cf0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
10d00 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
10d10 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
10d20 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
10d30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
10d40 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
10d50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
10d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
10d70 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
10d80 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
10d90 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
10da0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10db0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
10dc0 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
10dd0 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
10de0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
10df0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
10e00 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
10e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
10e20 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
10e30 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
10e40 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10e50 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10e60 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10e70 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
10e80 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
10e90 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
10ea0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10eb0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
10ec0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
10ed0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
10ee0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
10ef0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
10f00 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
10f10 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
10f20 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
10f30 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
10f40 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
10f50 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
10f60 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
10f70 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
10f80 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
10f90 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
10fa0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
10fb0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
10fc0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
10fd0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
10fe0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
10ff0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
11000 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
11010 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
11020 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11030 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
11040 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
11050 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
11060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
11070 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11080 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
11090 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
110a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
110b0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
110c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
110d0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
110e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  .          p->zE
110f0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
11100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 76     }.        inv
11110 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
11120 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
11130 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
11140 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
11150 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
11160 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
11170 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
11180 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
11190 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
111a0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
111b0 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
111c0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
111d0 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
111e0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
111f0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
11200 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
11210 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
11220 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
11230 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
11240 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
11250 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
11260 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
11270 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
11280 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
11290 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
112a0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
112b0 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
112c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
112d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
112e0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
112f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
11300 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
11310 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c   }.  .    /* Rol
11320 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20  lback or commit 
11330 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67  any schema chang
11340 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  es that occurred
11350 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
11360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
11370 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
11380 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
11390 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
113a0 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
113b0 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 20  ema(db, -1);.   
113c0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
113d0 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
113e0 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
113f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11400 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
11410 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
11420 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11430 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
11440 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
11450 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
11460 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
11470 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
11480 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
11490 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
114a0 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  beCnt--;.    if(
114b0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b   !p->readOnly ){
114c0 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65  .      db->write
114d0 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d  VdbeCnt--;.    }
114e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
114f0 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d  >activeVdbeCnt>=
11500 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
11510 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
11520 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
11530 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
11540 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
11550 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
11560 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11570 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
11580 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
11590 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
115a0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
115b0 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
115c0 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
115d0 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
115e0 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
115f0 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
11600 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
11610 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
11620 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
11630 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
11640 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
11650 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
11660 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
11670 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
11680 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
11690 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
116a0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
116b0 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c  ctiveVdbeCnt>0 |
116c0 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
116d0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74  ==0 || db->nStat
116e0 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65  ement==0 );.  re
116f0 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  turn (p->rc==SQL
11700 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54  ITE_BUSY ? SQLIT
11710 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f  E_BUSY : SQLITE_
11720 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  OK);.}.../*.** E
11730 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74  ach VDBE holds t
11740 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
11750 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
11760 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
11770 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54  .** in p->rc.  T
11780 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
11790 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63   that result bac
117a0 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  k to SQLITE_OK..
117b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
117c0 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75  dbeResetStepResu
117d0 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  lt(Vdbe *p){.  p
117e0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
117f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
11800 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
11810 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
11820 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11830 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
11840 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
11850 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
11860 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
11870 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
11880 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
11890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
118a0 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
118b0 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
118c0 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
118d0 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
118e0 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
118f0 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
11900 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
11910 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
11920 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11930 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
11940 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
11950 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
11960 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
11970 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
11980 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
11990 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
119a0 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
119b0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
119c0 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
119d0 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
119e0 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
119f0 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
11a00 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
11a10 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
11a20 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
11a30 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
11a40 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
11a50 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
11a60 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
11a70 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
11a80 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
11a90 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
11aa0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
11ab0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
11ac0 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
11ad0 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
11ae0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
11af0 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
11b00 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
11b10 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
11b20 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
11b30 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
11b40 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
11b50 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
11b60 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11b70 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
11b80 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
11b90 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11ba0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
11bb0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
11bc0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
11bd0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
11be0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
11bf0 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31  tStr(db->pErr,-1
11c00 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49  ,p->zErrMsg,SQLI
11c10 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
11c20 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
11c30 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11c40 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
11c50 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
11c60 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->rc;.      sqli
11c70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
11c80 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
11c90 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
11ca0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11cb0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
11cc0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
11cd0 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
11ce0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
11cf0 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
11d00 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
11d10 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
11d20 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
11d30 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
11d40 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
11d50 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
11d60 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
11d70 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
11d80 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
11d90 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
11da0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
11db0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
11dc0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
11dd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
11de0 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
11df0 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
11e00 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
11e10 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
11e20 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
11e30 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
11e40 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
11e50 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
11e60 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
11e70 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
11e80 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
11e90 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
11ea0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
11eb0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
11ec0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
11ed0 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
11ee0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
11ef0 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
11f00 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
11f10 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
11f20 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
11f30 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
11f40 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
11f50 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
11f60 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
11f70 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
11f80 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
11f90 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
11fa0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
11fb0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
11fc0 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
11fd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
11fe0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
11ff0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
12000 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
12010 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
12020 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
12030 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
12040 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12050 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
12060 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
12070 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c  "%6d %10lld %8ll
12080 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
12090 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
120a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
120b0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
120c0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
120d0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
120e0 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
120f0 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
12100 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73      );.        s
12110 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
12120 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
12130 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
12140 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
12150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
12160 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
12170 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
12180 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
12190 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
121a0 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
121b0 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
121c0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
121d0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
121e0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
121f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
12200 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
12210 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
12220 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
12230 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12240 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
12250 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
12260 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12270 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
12280 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
12290 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
122a0 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
122b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
122c0 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
122d0 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
122e0 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
122f0 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
12300 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
12310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12320 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
12330 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
12340 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
12350 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
12360 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
12370 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
12380 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
12390 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
123a0 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
123b0 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
123c0 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
123d0 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
123e0 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
123f0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
12400 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
12410 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12420 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
12430 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
12440 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
12450 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
12460 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
12470 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
12480 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
12490 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
124a0 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
124b0 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
124c0 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29  k&(((u32)1)<<i))
124d0 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20  ) && pAux->pAux 
124e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  ){.      if( pAu
124f0 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
12500 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
12510 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
12520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
12530 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  Aux->pAux = 0;. 
12540 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12550 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
12560 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
12570 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
12580 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
12590 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65  argument..** The
125a0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
125b0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
125c0 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
125d0 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
125e0 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
125f0 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
12600 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
12610 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
12620 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
12630 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
12640 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
12650 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12660 74 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  teObject(sqlite3
12670 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
12680 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
12690 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ub, *pNext;.  in
126a0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
126b0 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
126c0 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
126d0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
126e0 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
126f0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
12700 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
12710 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
12720 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
12730 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
12740 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
12750 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
12760 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
12770 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
12780 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
12790 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
127a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
127b0 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Sub);.  }.  for(
127c0 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e  i=p->nzVar-1; i>
127d0 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33  =0; i--) sqlite3
127e0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
127f0 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46  Var[i]);.  vdbeF
12800 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
12810 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
12820 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12830 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
12840 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12850 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
12860 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12870 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
12880 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12890 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20  db, p->pFree);. 
128a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
128b0 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
128c0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
128d0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
128e0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
128f0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
12900 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
12910 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
12920 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
12930 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  >db;.  if( p->pP
12940 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
12950 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
12960 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
12970 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12980 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
12990 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
129a0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
129b0 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
129c0 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
129d0 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
129e0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
129f0 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
12a00 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c  p->db = 0;.  sql
12a10 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62  ite3VdbeDeleteOb
12a20 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ject(db, p);.}..
12a30 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
12a40 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
12a50 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
12a60 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
12a70 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
12a80 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
12a90 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
12aa0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
12ab0 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
12ac0 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
12ad0 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
12ae0 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
12af0 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
12b00 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
12b10 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
12b20 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
12b30 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
12b40 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
12b50 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
12b60 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
12b70 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
12b80 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
12b90 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
12ba0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
12bb0 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
12bc0 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
12bd0 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
12be0 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
12bf0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
12c00 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
12c10 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
12c20 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
12c30 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
12c40 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
12c50 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
12c60 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
12c70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
12c80 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
12c90 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
12ca0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
12cb0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
12cc0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
12cd0 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
12ce0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
12cf0 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
12d00 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
12d10 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
12d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12d30 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
12d40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
12d50 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
12d60 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
12d70 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
12d80 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
12d90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12da0 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
12db0 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
12dc0 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73  get;.    if( res
12dd0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
12de0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12df0 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73  ;.    p->rowidIs
12e00 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65  Valid = 1;.#ifde
12e10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
12e20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
12e30 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
12e40 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
12e50 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
12e60 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
12e70 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
12e80 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
12e90 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a  (p->pCursor) ){.
12ea0 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64      int hasMoved
12eb0 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
12ec0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
12ed0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75  rHasMoved(p->pCu
12ee0 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29  rsor, &hasMoved)
12ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
12f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
12f10 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20  ( hasMoved ){.  
12f20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
12f30 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
12f40 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52  ;.      p->nullR
12f50 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ow = 1;.    }.  
12f60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12f70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
12f80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
12f90 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
12fa0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
12fb0 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
12fc0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
12fd0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
12fe0 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
12ff0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13000 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
13010 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
13020 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
13030 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
13040 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
13050 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
13060 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
13070 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
13080 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
13090 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
130a0 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
130b0 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
130c0 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
130d0 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
130e0 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
130f0 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
13100 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
13110 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
13120 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
13130 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
13140 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
13150 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
13160 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
13170 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
13180 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
13190 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
131a0 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
131b0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
131c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
131d0 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
131e0 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
131f0 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
13200 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
13210 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
13220 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
13230 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
13240 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
13250 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  seperately..**.*
13260 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13270 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
13280 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
13290 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
132a0 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
132b0 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
132c0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
132d0 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
132f0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
13300 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
13310 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
13340 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
13370 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13380 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
13390 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
133a0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
133b0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
133c0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
133d0 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
133e0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
133f0 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13410 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
13420 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13430 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
13440 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
13450 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13460 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13490 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
134a0 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
134c0 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
134d0 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13500 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
13510 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13530 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
13540 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
13550 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
13580 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
13590 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
135a0 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
135b0 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
135c0 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
135d0 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
135e0 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
135f0 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
13600 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
13610 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
13620 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
13630 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
13640 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
13650 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
13660 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
13670 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
13680 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
13690 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
136a0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
136b0 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
136c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
136d0 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
136e0 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
136f0 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
13700 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e  ->flags;.  int n
13710 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
13720 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
13730 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
13740 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
13750 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
13760 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
13770 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
13780 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
13790 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
137a0 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
137b0 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
137c0 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
137d0 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
137e0 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66  ;.    if( file_f
137f0 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31  ormat>=4 && (i&1
13800 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65  )==i ){.      re
13810 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20  turn 8+(u32)i;. 
13820 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30     }.    if( i<0
13830 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c   ){.      if( i<
13840 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72  (-MAX_6BYTE) ) r
13850 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f  eturn 6;.      /
13860 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20  * Previous test 
13870 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d  prevents:  u = -
13880 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  (-92233720368547
13890 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20  75808) */.      
138a0 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73  u = -i;.    }els
138b0 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
138c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
138d0 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b  =127 ) return 1;
138e0 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
138f0 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
13900 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
13910 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
13920 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
13930 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
13940 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
13950 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
13960 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
13970 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
13980 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
13990 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
139a0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
139b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
139c0 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
139d0 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
139e0 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
139f0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
13a00 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
13a10 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
13a20 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
13a30 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
13a40 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
13a50 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
13a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13a70 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
13a80 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
13a90 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
13aa0 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
13ab0 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
13ac0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
13ad0 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
13ae0 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
13af0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
13b00 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
13b10 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
13b20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
13b30 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
13b40 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
13b50 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
13b60 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
13b70 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
13b80 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
13b90 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
13ba0 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
13bb0 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
13bc0 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
13bd0 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
13be0 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
13bf0 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
13c00 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
13c10 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
13c20 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
13c30 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
13c40 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
13c50 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
13c60 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
13c70 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
13c80 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
13c90 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
13ca0 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
13cb0 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
13cc0 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
13cd0 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
13ce0 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
13cf0 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
13d00 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
13d10 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
13d20 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
13d30 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
13d40 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
13d50 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
13d60 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
13d70 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
13d80 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
13d90 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
13da0 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
13db0 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
13dc0 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
13dd0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
13de0 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
13df0 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
13e00 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
13e10 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
13e20 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
13e30 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
13e40 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
13e50 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
13e60 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
13e70 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
13e80 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
13e90 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
13ea0 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
13eb0 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
13ec0 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
13ed0 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
13ee0 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
13ef0 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
13f00 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
13f10 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
13f20 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
13f30 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
13f40 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
13f50 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
13f60 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
13f70 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
13f80 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
13f90 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
13fa0 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
13fb0 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
13fc0 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
13fd0 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
13fe0 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
13ff0 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
14000 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
14010 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
14020 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
14030 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
14040 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
14050 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
14060 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
14070 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
14080 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
14090 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
140a0 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
140b0 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
140c0 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
140d0 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
140e0 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
140f0 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
14100 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
14110 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
14120 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
14130 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
14140 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
14150 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
14160 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
14170 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
14180 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
14190 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
141a0 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
141b0 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
141c0 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
141d0 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
141e0 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
141f0 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
14200 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
14210 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
14220 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
14230 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
14240 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
14250 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
14260 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
14270 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
14280 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
14290 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
142a0 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
142b0 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
142c0 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
142d0 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
142e0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
142f0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
14300 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
14310 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
14320 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
14330 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
14340 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
14350 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
14360 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
14370 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
14380 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
14390 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
143a0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
143b0 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
143c0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
143d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
143e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
143f0 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
14400 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
14410 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
14420 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
14430 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
14440 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
14450 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
14460 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
14470 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
14480 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
14490 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
144a0 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
144b0 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
144c0 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
144d0 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
144e0 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
144f0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
14500 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
14510 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
14520 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
14530 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
14540 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
14550 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
14560 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
14570 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
14580 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
14590 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
145a0 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
145b0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
145c0 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
145d0 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
145e0 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
145f0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
14600 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
14610 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
14620 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
14630 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
14640 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
14650 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
14660 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
14670 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
14680 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
14690 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
146a0 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
146b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
146c0 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
146d0 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
146e0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
146f0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
14700 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
14710 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
14720 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
14730 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
14740 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
14750 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
14760 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
14770 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
14780 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
14790 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
147a0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
147b0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
147c0 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
147d0 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
147e0 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
147f0 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
14800 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
14810 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
14820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14830 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
14840 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
14850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
14860 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
14870 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
14880 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29  sert( len<=(u32)
14890 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c  nBuf );.    whil
148a0 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
148b0 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26  buf[i] = (u8)(v&
148c0 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
148d0 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >= 8;.    }.    
148e0 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
148f0 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
14900 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
14910 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
14920 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
14930 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
14940 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
14950 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30  ?pMem->u.nZero:0
14960 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
14970 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
14980 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
14990 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
149a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
149b0 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
149c0 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
149d0 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
149e0 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
149f0 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
14a00 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
14a10 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
14a20 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  em->u.nZero;.   
14a30 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e     assert( nBuf>
14a40 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
14a50 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20  len > (u32)nBuf 
14a60 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
14a70 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20   (u32)nBuf;.    
14a80 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
14a90 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20  (&buf[pMem->n], 
14aa0 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b  0, len-pMem->n);
14ab0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14ac0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
14ad0 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
14ae0 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
14af0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
14b00 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
14b10 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
14b20 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
14b30 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
14b40 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
14b50 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
14b60 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
14b70 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14b80 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
14b90 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
14ba0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
14bb0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14bc0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
14bd0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
14be0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
14bf0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
14c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
14c10 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
14c20 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
14c30 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
14c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
14c50 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
14c60 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
14c70 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
14c80 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
14c90 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
14ca0 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
14cb0 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
14cc0 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
14cd0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
14ce0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
14cf0 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
14d00 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
14d10 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
14d20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14d30 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
14d40 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
14d50 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14d60 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
14d70 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
14d80 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
14d90 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
14da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
14db0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14dc0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
14dd0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14de0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
14df0 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
14e00 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
14e10 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[1];.      pM
14e20 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14e30 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
14e40 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
14e50 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
14e60 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
14e70 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
14e80 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
14e90 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
14ea0 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
14eb0 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
14ec0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14ed0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
14ee0 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
14ef0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
14f00 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
14f10 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
14f20 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30  em->u.i = (buf[0
14f30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
14f40 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
14f50 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
14f60 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14f70 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
14f80 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
14f90 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
14fa0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
14fb0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
14fc0 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
14fd0 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
14fe0 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
14ff0 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
15000 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
15010 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
15020 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
15030 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
15040 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
15050 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
15060 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &x;.      pMem->
15070 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
15080 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
15090 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
150a0 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
150b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
150c0 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
150d0 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
150e0 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75  point */.      u
150f0 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20  64 x;.      u32 
15100 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  y;.#if !defined(
15110 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
15120 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15130 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
15140 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
15150 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
15160 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
15170 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
15180 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
15190 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
151a0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
151b0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
151c0 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
151d0 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
151e0 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
151f0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
15200 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
15210 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
15220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
15230 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
15240 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
15250 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
15260 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
15270 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
15280 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
15290 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
152a0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
152b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
152c0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
152d0 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
152e0 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
152f0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
15300 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
15310 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
15320 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
15330 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
15340 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
15350 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
15360 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
15370 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
15380 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
15390 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
153a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
153b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
153c0 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
153d0 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
153e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
153f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15400 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
15410 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
15420 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
15430 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  8 );.        swa
15440 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
15450 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  t(x);.        me
15460 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26  mcpy(&pMem->r, &
15470 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
15480 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
15490 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
154a0 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d  N(pMem->r) ? MEM
154b0 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
154c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154d0 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
154e0 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
154f0 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
15500 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
15510 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
15520 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
15530 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
15540 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15550 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15560 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
15570 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
15580 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d  .      u32 len =
15590 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
155a0 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
155b0 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
155c0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
155d0 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
155e0 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
155f0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
15600 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
15610 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15620 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
15630 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
15640 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
15650 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
15660 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
15670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
15680 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
15690 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
156a0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
156b0 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
156c0 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
156d0 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72  d in pKey[], par
156e0 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  se the.** record
156f0 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64   into a Unpacked
15700 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
15710 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
15720 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
15730 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
15740 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
15750 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69  tion might provi
15760 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73  de szSpace bytes
15770 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70   of memory.** sp
15780 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20  ace at pSpace.  
15790 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62  This space can b
157a0 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  e used to hold t
157b0 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56  he returned.** V
157c0 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20  DbeParsedRecord 
157d0 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20  structure if it 
157e0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e  is large enough.
157f0 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f    If it is.** no
15800 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70  t big enough, sp
15810 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ace is obtained 
15820 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
15830 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  loc()..**.** The
15840 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74   returned struct
15850 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ure should be cl
15860 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  osed by a call t
15870 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  o.** sqlite3Vdbe
15880 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
15890 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61  cord()..*/ .Unpa
158a0 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
158b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
158c0 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
158d0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
158e0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
158f0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
15900 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
15910 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
15920 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
15930 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
15940 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
15950 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
15960 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
15970 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
15980 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ,          /* Un
15990 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
159a0 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  ailable to hold 
159b0 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
159c0 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20  int szSpace     
159d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
159e0 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
159f0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  tes */.){.  cons
15a00 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
15a10 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
15a20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
15a30 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  Key;.  UnpackedR
15a40 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68  ecord *p;  /* Th
15a50 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
15a60 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72  d that we will r
15a70 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
15a80 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Byte;          /
15a90 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e  * Memory space n
15aa0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c  eeded to hold p,
15ab0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
15ac0 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b  nt d;.  u32 idx;
15ad0 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
15ae0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
15af0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
15b00 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
15b10 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69    Mem *pMem;.  i
15b20 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
15b30 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70     /* Increase p
15b40 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75  Space by this mu
15b50 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69  ch to 8-byte ali
15b60 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a  gn it */.  .  /*
15b70 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  ** We want to
15b80 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
15b90 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
15ba0 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
15bb0 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
15bc0 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
15bd0 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
15be0 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
15bf0 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
15c00 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
15c10 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
15c20 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
15c30 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
15c40 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
15c50 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
15c60 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
15c70 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
15c80 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20  ) & 7;.  pSpace 
15c90 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61  += nOff;.  szSpa
15ca0 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42  ce -= nOff;.  nB
15cb0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
15cc0 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
15cd0 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
15ce0 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
15cf0 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
15d00 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a  Byte>szSpace ){.
15d10 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
15d20 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
15d30 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
15d40 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
15d50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d  return 0;.    p-
15d60 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  >flags = UNPACKE
15d70 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e  D_NEED_FREE | UN
15d80 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
15d90 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROY;.  }else{.  
15da0 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
15db0 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20  ecord*)pSpace;. 
15dc0 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
15dd0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
15de0 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  ROY;.  }.  p->pK
15df0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
15e00 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
15e10 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
15e20 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d  d + 1;.  p->aMem
15e30 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29   = pMem = (Mem*)
15e40 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
15e50 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
15e60 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
15e70 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
15e80 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
15e90 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
15ea0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
15eb0 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
15ec0 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
15ed0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
15ee0 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26  && u<p->nField &
15ef0 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
15f00 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
15f10 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
15f20 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
15f30 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
15f40 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
15f50 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
15f60 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
15f70 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
15f80 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
15f90 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
15fa0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
15fb0 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
15fc0 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
15fd0 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  em->zMalloc = 0;
15fe0 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30  .    pMem->z = 0
15ff0 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
16000 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16010 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
16020 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
16030 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
16040 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
16050 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
16060 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
16070 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72  >nField = u;.  r
16080 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a  eturn (void*)p;.
16090 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
160a0 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61  utine destroys a
160b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
160c0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
160d0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
160e0 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
160f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
16100 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
16110 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 69 3b  E_DEBUG.  int i;
16120 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20  .  Mem *pMem;.. 
16130 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
16140 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c  .  assert( p->fl
16150 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e  ags & UNPACKED_N
16160 45 45 44 5f 44 45 53 54 52 4f 59 20 29 3b 0a 20  EED_DESTROY );. 
16170 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70   for(i=0, pMem=p
16180 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69  ->aMem; i<p->nFi
16190 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b  eld; i++, pMem++
161a0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  ){.    /* The un
161b0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 69 73  packed record is
161c0 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 72 75 63   always construc
161d0 74 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ted by the.    *
161e0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 55 6e 70  * sqlite3VdbeUnp
161f0 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63  ackRecord() func
16200 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68 69 63  tion above, whic
16210 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20 20  h makes all.    
16220 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  ** strings and b
16230 6c 6f 62 73 20 73 74 61 74 69 63 2e 20 20 41 6e  lobs static.  An
16240 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65 6c  d none of the el
16250 65 6d 65 6e 74 73 20 61 72 65 0a 20 20 20 20 2a  ements are.    *
16260 2a 20 65 76 65 72 20 74 72 61 6e 73 66 6f 72 6d  * ever transform
16270 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
16280 6e 65 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74  never anything t
16290 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 20 2a 2f  o delete..    */
162a0 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a  .    if( pMem->z
162b0 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
162c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
162d0 4d 65 6d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Mem);.  }.#endif
162e0 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
162f0 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
16300 46 52 45 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  FREE ){.    sqli
16310 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70 4b 65  te3DbFree(p->pKe
16320 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20  yInfo->db, p);. 
16330 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
16340 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
16350 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
16360 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
16370 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
16380 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
16390 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
163a0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
163b0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
163c0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
163d0 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
163e0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
163f0 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
16400 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
16410 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
16420 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
16430 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
16440 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65   by th OP_MakeRe
16450 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
16460 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
16470 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
16480 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
16490 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
164a0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
164b0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
164c0 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
164d0 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
164e0 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
164f0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
16500 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b  fields..** The k
16510 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66 69  ey with fewer fi
16520 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20  elds is usually 
16530 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68  compares less th
16540 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65  an the .** longe
16550 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20  r key.  However 
16560 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
16570 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e  INCRKEY flags in
16580 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a   pPKey2 is set.*
16590 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  * and the common
165a0 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65 71   prefixes are eq
165b0 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69  ual, then key1 i
165c0 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32  s less than key2
165d0 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55  ..** Or if the U
165e0 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52  NPACKED_MATCH_PR
165f0 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65 74  EFIX flag is set
16600 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78 65   and the prefixe
16610 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20  s are.** equal, 
16620 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72  then the keys ar
16630 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
16640 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20  be equal and.** 
16650 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64  the parts beyond
16660 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66   the common pref
16670 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ix are ignored..
16680 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e 50  **.** If the UNP
16690 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57  ACKED_IGNORE_ROW
166a0 49 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ID flag is set, 
166b0 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 62 79  then the last by
166c0 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61  te of.** the hea
166d0 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69 73 20  der of pKey1 is 
166e0 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69 73 20  ignored.  It is 
166f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 70 4b 65  assumed that pKe
16700 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65  y1 is.** an inde
16710 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75 73 20  x key, and thus 
16720 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f 77 69  ends with a rowi
16730 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20 6c 61  d value.  The la
16740 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  st byte.** of th
16750 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20 74 68  e header will th
16760 65 72 65 66 6f 72 65 20 62 65 20 74 68 65 20 73  erefore be the s
16770 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
16780 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20  e rowid:.** one 
16790 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35  of 1, 2, 3, 4, 5
167a0 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74  , 6, 8, or 9 - t
167b0 68 65 20 69 6e 74 65 67 65 72 20 73 65 72 69 61  he integer seria
167c0 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20  l types..** The 
167d0 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  serial type of t
167e0 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 77  he final rowid w
167f0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20  ill always be a 
16800 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20  single byte..** 
16810 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 69 73  By ignoring this
16820 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74 68   last byte of th
16830 65 20 68 65 61 64 65 72 2c 20 77 65 20 66 6f 72  e header, we for
16840 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
16850 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74  n.** to ignore t
16860 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
16870 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a  end of key1..*/.
16880 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
16890 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
168a0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
168b0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
168c0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
168d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
168e0 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
168f0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
16900 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20 20 20    int d1;       
16910 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
16920 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
16930 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
16940 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
16950 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16960 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
16970 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
16980 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
16990 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
169a0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
169b0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
169c0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
169d0 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63  nField;.  int rc
169e0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
169f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
16a00 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
16a10 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
16a20 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
16a30 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
16a40 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
16a50 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
16a60 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d  fo;.  mem1.enc =
16a70 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
16a80 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
16a90 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d  Info->db;.  /* m
16aa0 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20  em1.flags = 0;  
16ab0 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69  // Will be initi
16ac0 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alized by sqlite
16ad0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
16ae0 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   */.  VVA_ONLY( 
16af0 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  mem1.zMalloc = 0
16b00 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
16b10 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
16b20 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  tatements */..  
16b30 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79  /* Compilers may
16b40 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d   complain that m
16b50 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e  em1.u.i is poten
16b60 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c  tially uninitial
16b70 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f  ized..  ** We co
16b80 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  uld initialize i
16b90 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65  t, as shown here
16ba0 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f  , to silence tho
16bb0 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20  se complaints.. 
16bc0 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c   ** But in fact,
16bd0 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e   mem1.u.i will n
16be0 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65  ever actually be
16bf0 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69   used uninitiali
16c00 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
16c10 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
16c20 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
16c30 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
16c40 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
16c50 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
16c60 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
16c70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
16c80 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
16c90 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
16ca0 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
16cb0 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
16cc0 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
16cd0 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
16ce0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16cf0 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
16d00 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
16d10 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
16d20 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
16d30 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
16d40 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
16d50 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
16d60 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
16d70 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32  r1;.  if( pPKey2
16d80 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
16d90 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
16da0 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b  ){.    szHdr1--;
16db0 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20  .  }.  nField = 
16dc0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
16dd0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c  ;.  while( idx1<
16de0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
16df0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  y2->nField ){.  
16e00 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16e10 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
16e20 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
16e30 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
16e40 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
16e50 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
16e60 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
16e70 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
16e80 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
16e90 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
16ea0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16eb0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
16ec0 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
16ed0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  k;..    /* Extra
16ee0 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
16ef0 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
16f00 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
16f10 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16f20 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
16f30 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
16f40 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
16f50 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
16f60 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
16f70 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
16f80 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
16f90 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f        i<nField ?
16fc0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16fd0 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
16fe0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
16ff0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
17000 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
17010 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
17020 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w */..      /* I
17030 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
17040 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
17050 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
17060 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
17070 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
17080 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64 20  der && i<nField 
17090 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
170a0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
170b0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
170c0 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
170d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45     /* If the PRE
170e0 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
170f0 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66  is set and all f
17100 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65  ields except the
17110 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20   final.      ** 
17120 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65  rowid field were
17130 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65   equal, then cle
17140 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  ar the PREFIX_SE
17150 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65  ARCH flag and se
17160 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65  t .      ** pPKe
17170 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65  y2->rowid to the
17180 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
17190 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b  wid field in (pK
171a0 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20  ey1, nKey1)..   
171b0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73     ** This is us
171c0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
171d0 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20  nique opcode..  
171e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
171f0 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20   (pPKey2->flags 
17200 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
17210 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d  X_SEARCH) && i==
17220 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d  (pPKey2->nField-
17230 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  1) ){.        as
17240 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64  sert( idx1==szHd
17250 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20  r1 && rc );.    
17260 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
17270 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  .flags & MEM_Int
17280 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65   );.        pPKe
17290 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e  y2->flags &= ~UN
172a0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
172b0 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50  ARCH;.        pP
172c0 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65  Key2->rowid = me
172d0 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  m1.u.i;.      }.
172e0 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72      .      retur
172f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17300 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  i++;.  }..  /* N
17310 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
17320 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
17330 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
17340 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
17350 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
17360 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
17370 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
17380 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
17390 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
173a0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
173b0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
173c0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
173d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
173e0 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
173f0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
17400 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
17410 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
17420 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
17430 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
17440 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
17450 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
17460 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e  equal. If the UN
17470 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20  PACKED_INCRKEY. 
17480 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
17490 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20   then break the 
174a0 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20  tie by treating 
174b0 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a  key2 as larger..
174c0 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43    ** If the UPAC
174d0 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
174e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
174f0 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d  en keys with com
17500 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a  mon prefixes.  *
17510 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
17520 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
17530 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
17540 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
17550 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41  .  ** larger.  A
17560 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
17570 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
17580 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
17590 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  er.  ** if there
175a0 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65   is a difference
175b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
175c0 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20   rc==0 );.  if( 
175d0 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
175e0 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
175f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b   ){.    rc = -1;
17600 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
17610 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
17620 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
17630 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61  CH ){.    /* Lea
17640 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65  ve rc==0 */.  }e
17650 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48  lse if( idx1<szH
17660 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  dr1 ){.    rc = 
17670 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
17680 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70  rc;.}. ../*.** p
17690 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
176a0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
176b0 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
176c0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
176d0 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
176e0 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
176f0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
17700 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
17710 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
17720 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
17730 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
17740 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
17750 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
17760 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
17770 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
17780 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
17790 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
177a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
177b0 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
177c0 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
177d0 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
177e0 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
177f0 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
17800 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
17810 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
17820 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
17830 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
17840 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
17850 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
17860 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
17870 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
17880 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
17890 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
178a0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
178b0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
178c0 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
178d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
178e0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
178f0 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  m, v;..  UNUSED_
17900 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a  PARAMETER(db);..
17910 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
17920 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
17930 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
17940 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
17950 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
17960 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
17970 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
17980 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
17990 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
179a0 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
179b0 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
179c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
179d0 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
179e0 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
179f0 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
17a00 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
17a10 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
17a20 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
17a30 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
17a40 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
17a50 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
17a60 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
17a70 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
17a80 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
17a90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
17aa0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
17ab0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
17ac0 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
17ad0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
17ae0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
17af0 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
17b00 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
17b10 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
17b20 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
17b30 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
17b40 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   */.  memset(&m,
17b50 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
17b60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
17b70 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
17b80 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
17b90 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
17ba0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17bb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17bc0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
17bd0 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
17be0 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
17bf0 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
17c00 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
17c10 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
17c20 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
17c30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
17c40 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
17c50 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
17c60 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
17c70 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
17c80 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
17c90 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
17ca0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
17cb0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
17cc0 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
17cd0 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
17ce0 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
17cf0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
17d00 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
17d10 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
17d20 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
17d30 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
17d40 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
17d50 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17d60 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
17d70 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17d80 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
17d90 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
17da0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17db0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
17dc0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17dd0 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
17de0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17df0 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
17e00 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
17e10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17e20 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
17e30 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
17e40 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
17e50 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
17e60 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
17e70 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
17e80 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
17e90 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
17ea0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17eb0 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
17ec0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
17ed0 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
17ee0 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
17ef0 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
17f00 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
17f10 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17f20 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17f30 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
17f40 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
17f50 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
17f60 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
17f70 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
17f80 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
17f90 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
17fa0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
17fb0 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
17fc0 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
17fd0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
17fe0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17ff0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
18000 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
18010 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
18020 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
18030 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
18040 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
18050 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
18060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18070 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
18080 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
18090 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
180a0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
180b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
180c0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
180d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
180e0 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
180f0 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
18100 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
18110 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
18120 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
18130 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
18140 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
18150 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
18160 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
18170 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
18180 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
18190 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
181a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
181b0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
181c0 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
181d0 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
181e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
181f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
18200 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
18210 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
18220 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
18230 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
18240 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
18250 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
18260 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
18270 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
18280 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
18290 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
182a0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
182b0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
182c0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
182d0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
182e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
182f0 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
18300 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
18310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18320 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
18330 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
18340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18350 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
18360 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
18370 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
18380 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
18390 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
183a0 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f  ion of key to co
183b0 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
183c0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
183e0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
183f0 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
18400 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
18410 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
18420 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
18430 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
18440 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
18450 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18460 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
18470 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
18480 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18490 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
184a0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
184b0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
184c0 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
184d0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
184e0 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
184f0 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
18500 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
18510 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
18520 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
18530 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
18540 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  say.  ** that bt
18550 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
18560 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
18570 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
18580 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
18590 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
185a0 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
185b0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
185c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
185d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
185e0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
185f0 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
18600 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
18610 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
18620 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
18630 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
18640 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
18650 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
18660 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
18670 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
18680 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
18690 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
186a0 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
186b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
186c0 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
186d0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
186e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
186f0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
18700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18710 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18720 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
18730 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
18740 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
18750 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
18760 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
18770 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
18780 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
18790 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
187a0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
187b0 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
187c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
187d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
187e0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
187f0 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
18800 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
18810 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
18820 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
18830 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
18840 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
18850 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
18860 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
18870 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
18880 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
18890 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
188a0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
188b0 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
188c0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
188d0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
188e0 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
188f0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
18900 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18910 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
18920 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
18930 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
18940 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
18950 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
18960 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
18970 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
18980 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
18990 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
189a0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
189b0 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
189c0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
189d0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
189e0 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
189f0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
18a00 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
18a10 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
18a20 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
18a30 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
18a40 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
18a50 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
18a60 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
18a70 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
18a80 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
18a90 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
18aa0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
18ab0 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
18ac0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
18ad0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
18ae0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
18af0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
18b00 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
18b10 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
18b20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
18b30 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
18b40 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
18b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18b60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
18b70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
18b80 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
18b90 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
18ba0 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
18bb0 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
18bc0 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
18bd0 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
18be0 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
18bf0 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
18c00 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
18c10 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
18c20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
18c30 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
18c40 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
18c50 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
18c60 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
18c70 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
18c80 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
18c90 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
18ca0 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
18cb0 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
18cc0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
18cd0 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64  3VdbeGetValue(Vd
18ce0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
18cf0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
18d00 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
18d10 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
18d20 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
18d30 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
18d40 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
18d50 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
18d60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18d70 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
18d80 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
18d90 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
18da0 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
18db0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
18dc0 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
18dd0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
18de0 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
18df0 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
18e00 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
18e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18e20 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
18e30 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a  e((Mem *)pRet);.
18e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18e50 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
18e60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
18e80 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
18e90 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
18ea0 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
18eb0 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
18ec0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
18ed0 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
18ee0 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
18ef0 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
18f00 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
18f10 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
18f20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18f30 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
18f40 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
18f50 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
18f60 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
18f70 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
18f80 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
18f90 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
18fa0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
18fb0 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
18fc0 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  -1));.  }.}..#if
18fd0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18fe0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
18ff0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
19000 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
19010 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  k. If this is an
19020 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
19030 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c  E pre-update cal
19040 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f  l,.** then curso
19050 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
19060 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19070 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
19080 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a  the row about.**
19090 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72   to be update or
190a0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65   deleted. If the
190b0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c   application cal
190c0 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  ls sqlite3_preup
190d0 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74  date_old(),.** t
190e0 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75  he required valu
190f0 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  e will be read f
19100 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20  rom the row the 
19110 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
19120 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19130 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f  3VdbePreUpdateHo
19140 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ok(.  Vdbe *v,  
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72        /* Vdbe pr
19170 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73  e-update hook is
19180 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20   invoked by */. 
19190 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73   VdbeCursor *pCs
191a0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
191b0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72   /* Cursor to gr
191c0 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20  ab old.* values 
191d0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  from */.  int op
191e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
191f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
19200 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41  ITE_INSERT, UPDA
19210 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a  TE or DELETE */.
19220 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19230 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
19240 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
19250 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
19260 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
19270 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66          /* Modif
19280 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ied table */.  i
19290 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20  64 iKey1,       
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
192b0 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61  * Initial key va
192c0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  lue */.  int iRe
192d0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
192e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
192f0 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72  ster for new.* r
19300 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  ecord */.){.  sq
19310 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64  lite3 *db = v->d
19320 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a  b;.  i64 iKey2;.
19330 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75    PreUpdate preu
19340 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pdate;.  const c
19350 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62  har *zTbl = pTab
19360 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  ->zName;..  asse
19370 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61  rt( db->pPreUpda
19380 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  te==0 );.  memse
19390 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c  t(&preupdate, 0,
193a0 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74   sizeof(PreUpdat
193b0 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53  e));.  if( op==S
193c0 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
193d0 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
193e0 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
193f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79   }else{.    iKey
19400 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a  2 = iKey1;.  }..
19410 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20    preupdate.v = 
19420 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  v;.  preupdate.p
19430 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72  Csr = pCsr;.  pr
19440 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b  eupdate.op = op;
19450 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65  .  preupdate.iNe
19460 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70  wReg = iReg;.  p
19470 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
19480 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75  .db = db;.  preu
19490 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e  pdate.keyinfo.en
194a0 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70  c = ENC(db);.  p
194b0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
194c0 2e 6e 46 69 65 6c 64 20 3d 20 70 43 73 72 2d 3e  .nField = pCsr->
194d0 6e 46 69 65 6c 64 3b 0a 20 20 70 72 65 75 70 64  nField;.  preupd
194e0 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79  ate.iKey1 = iKey
194f0 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  1;.  preupdate.i
19500 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20  Key2 = iKey2;.  
19510 70 72 65 75 70 64 61 74 65 2e 69 50 4b 65 79 20  preupdate.iPKey 
19520 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a  = pTab->iPKey;..
19530 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
19540 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20   = &preupdate;. 
19550 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
19560 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65  allback(db->pPre
19570 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f  UpdateArg, db, o
19580 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b  p, zDb, zTbl, iK
19590 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64  ey1, iKey2);.  d
195a0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
195b0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
195c0 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
195d0 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  .aRecord);.  if(
195e0 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61   preupdate.pUnpa
195f0 63 6b 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  cked ){.    sqli
19600 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
19610 61 63 6b 65 64 52 65 63 6f 72 64 28 70 72 65 75  ackedRecord(preu
19620 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
19630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 75  ;.  }.  if( preu
19640 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b  pdate.pNewUnpack
19650 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
19660 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
19670 6b 65 64 52 65 63 6f 72 64 28 70 72 65 75 70 64  kedRecord(preupd
19680 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64  ate.pNewUnpacked
19690 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65  );.  }.  if( pre
196a0 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20  update.aNew ){. 
196b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
196c0 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
196d0 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
196e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
196f0 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64  mRelease(&preupd
19700 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20  ate.aNew[i]);.  
19710 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
19720 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
19730 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d  ate.aNew);.  }.}
19740 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19750 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
19760 54 45 5f 48 4f 4f 4b 20 2a 2f 0a                 TE_HOOK */.