/ Hex Artifact Content
Login

Artifact ca1eada4b21723a67c510c0f456217c03ad15e48:


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 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61   needs to mark a
13c0: 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20  ll btrees.** as 
13d0: 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64  having been used
13e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65  ..**.** The zWhe
13f0: 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68  re string must h
1400: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
1410: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
1420: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73  alloc()..** This
1430: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61   routine will ta
1440: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ke ownership of 
1450: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
1460: 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mory..*/.void sq
1470: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1480: 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a  eSchemaOp(Vdbe *
1490: 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72  p, int iDb, char
14a0: 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *zWhere){.  int
14b0: 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d   j;.  int addr =
14c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d0: 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(p, OP_ParseSc
14e0: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29  hema, iDb, 0, 0)
14f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1500: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1510: 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41   zWhere, P4_DYNA
1520: 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  MIC);.  for(j=0;
1530: 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a   j<p->db->nDb; j
1540: 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55  ++) sqlite3VdbeU
1550: 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a  sesBtree(p, j);.
1560: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1570: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1580: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1590: 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  e as an integer.
15a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15b0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20  dbeAddOp4Int(.  
15c0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
15d0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
15e0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
15f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
1600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1610: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1620: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1630: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
1640: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1650: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
1660: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
1670: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
1680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1690: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
16a0: 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20    int p4        
16b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20        /* The P4 
16c0: 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e  operand as an in
16d0: 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  teger */.){.  in
16e0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
16f0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
1700: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1710: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1720: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51  geP4(p, addr, SQ
1730: 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
1740: 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  p4), P4_INT32);.
1750: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1760: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1770: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
1780: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
1790: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
17a0: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
17b0: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
17c0: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
17d0: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
17e0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
17f0: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
1800: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
1810: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
1820: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
1830: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
1840: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
1850: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
1860: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
1870: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
1880: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
1890: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
18a0: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
18b0: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
18c0: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
18d0: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
18e0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
18f0: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
1900: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1910: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
1920: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
1930: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
1940: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
1950: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
1960: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
1970: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
1980: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
1990: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
19a0: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  be resolved..**.
19b0: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
19c0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ned if a malloc(
19d0: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  ) fails..*/.int 
19e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19f0: 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  abel(Vdbe *p){. 
1a00: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d   int i;.  i = p-
1a10: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73  >nLabel++;.  ass
1a20: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1a30: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1a40: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c  ;.  if( i>=p->nL
1a50: 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  abelAlloc ){.   
1a60: 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62   int n = p->nLab
1a70: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20  elAlloc*2 + 5;. 
1a80: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73     p->aLabel = s
1a90: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
1aa0: 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  rFree(p->db, p->
1ab0: 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  aLabel,.        
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1ae0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
1af0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e 6e  l[0]));.    p->n
1b00: 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c  LabelAlloc = sql
1b10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
1b20: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
1b30: 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61  l)/sizeof(p->aLa
1b40: 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69  bel[0]);.  }.  i
1b50: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1b60: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
1b70: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
1b80: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
1b90: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
1ba0: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
1bb0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1bc0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
1bd0: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
1be0: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
1bf0: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
1c00: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
1c10: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
1c20: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
1c30: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
1c40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1c50: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
1c60: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
1c70: 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20  int j = -1-x;.  
1c80: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1c90: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1ca0: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  T );.  assert( j
1cb0: 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62  >=0 && j<p->nLab
1cc0: 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  el );.  if( p->a
1cd0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
1ce0: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e  aLabel[j] = p->n
1cf0: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
1d00: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
1d10: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
1d20: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
1d30: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1d40: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
1d50: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
1d60: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
1d70: 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   1;.}..#ifdef SQ
1d80: 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71  LITE_DEBUG /* sq
1d90: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
1da0: 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a  ort() logic */..
1db0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1dc0: 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e  ing type and fun
1dd0: 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  ction are used t
1de0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1df0: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  h all opcodes.**
1e00: 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20   in a Vdbe main 
1e10: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68  program and each
1e20: 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   of the sub-prog
1e30: 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20  rams (triggers) 
1e40: 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b  it may .** invok
1e50: 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  e directly or in
1e60: 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f  directly. It sho
1e70: 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66  uld be used as f
1e80: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1e90: 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64  Op *pOp;.**   Vd
1ea0: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
1eb0: 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26  **.**   memset(&
1ec0: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
1ed0: 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73  (sIter));.**   s
1ee0: 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20  Iter.v = v;     
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f         // v is o
1f10: 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a  f type Vdbe* .**
1f20: 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d     while( (pOp =
1f30: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
1f40: 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f  er)) ){.**     /
1f50: 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  / Do something w
1f60: 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a  ith pOp.**   }.*
1f70: 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  *   sqlite3DbFre
1f80: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
1f90: 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79  pSub);.** .*/.ty
1fa0: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62  pedef struct Vdb
1fb0: 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74  eOpIter VdbeOpIt
1fc0: 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f  er;.struct VdbeO
1fd0: 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a  pIter {.  Vdbe *
1fe0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1ff0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
2000: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2010: 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a  the opcodes of *
2020: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
2030: 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f  *apSub;        /
2040: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72  * Array of subpr
2050: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
2060: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  nSub;           
2070: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2080: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2090: 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41  pSub */.  int iA
20a0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
20b0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
20c0: 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  of next instruct
20d0: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ion to return */
20e0: 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20  .  int iSub;    
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2100: 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61   0 = main progra
2110: 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62  m, 1 = first sub
2120: 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f  -program etc. */
2130: 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f  .};.static Op *o
2140: 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70  pIterNext(VdbeOp
2150: 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65  Iter *p){.  Vdbe
2160: 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70   *v = p->v;.  Op
2170: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70   *pRet = 0;.  Op
2180: 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70   *aOp;.  int nOp
2190: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62  ;..  if( p->iSub
21a0: 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20  <=p->nSub ){..  
21b0: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30    if( p->iSub==0
21c0: 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20   ){.      aOp = 
21d0: 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  v->aOp;.      nO
21e0: 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  p = v->nOp;.    
21f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70  }else{.      aOp
2200: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
2210: 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20  Sub-1]->aOp;.   
2220: 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75     nOp = p->apSu
2230: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f  b[p->iSub-1]->nO
2240: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  p;.    }.    ass
2250: 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f  ert( p->iAddr<nO
2260: 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d  p );..    pRet =
2270: 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b   &aOp[p->iAddr];
2280: 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b  .    p->iAddr++;
2290: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64  .    if( p->iAdd
22a0: 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  r==nOp ){.      
22b0: 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20  p->iSub++;.     
22c0: 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20   p->iAddr = 0;. 
22d0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
22e0: 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34  pRet->p4type==P4
22f0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
2300: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
2310: 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a   (p->nSub+1)*siz
2320: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
2330: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2340: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2350: 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20  p->nSub; j++){. 
2360: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70         if( p->ap
2370: 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34  Sub[j]==pRet->p4
2380: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
2390: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
23a0: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20   if( j==p->nSub 
23b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  ){.        p->ap
23c0: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52  Sub = sqlite3DbR
23d0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e  eallocOrFree(v->
23e0: 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42  db, p->apSub, nB
23f0: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
2400: 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20  ( !p->apSub ){. 
2410: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
2420: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
2430: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
2440: 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20  pSub[p->nSub++] 
2450: 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  = pRet->p4.pProg
2460: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ram;.        }. 
2470: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2480: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
2490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
24a0: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73  if the program s
24b0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20  tored in the VM 
24c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24d0: 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68  pParse may.** th
24e0: 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
24f0: 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20  eption (causing 
2500: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  the statement, b
2510: 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72  ut not entire tr
2520: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  ansaction.** to 
2530: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e  be rolled back).
2540: 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
2550: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d  is true if the m
2560: 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61  ain program or a
2570: 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61  ny.** sub-progra
2580: 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ms contains any 
2590: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
25a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
25b0: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
25c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
25d0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
25e0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49  **   *  OP_HaltI
25f0: 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51  fNull with P1=SQ
2600: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2610: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2620: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
2630: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
2640: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
2650: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a  P_VRename.**   *
2660: 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77    OP_FkCounter w
2670: 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64  ith P2==0 (immed
2680: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
2690: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a   constraint).**.
26a0: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
26b0: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
26c0: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
26d0: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
26e0: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
26f0: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
2700: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
2710: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
2720: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
2730: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
2740: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
2750: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
2760: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
2770: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
2780: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
2790: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
27a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
27b0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
27c0: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
27d0: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
27e0: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
27f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2800: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2810: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
2820: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
2830: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f  asAbort = 0;.  O
2840: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
2850: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
2860: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
2870: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
2880: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
2890: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
28a0: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
28b0: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
28c0: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
28d0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
28e0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
28f0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
2900: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
2910: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
2920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2930: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
2940: 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d       || (opcode=
2950: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
2960: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
2970: 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64  Op->p2==1) .#end
2980: 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63  if.     || ((opc
2990: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20  ode==OP_Halt || 
29a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49  opcode==OP_HaltI
29b0: 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26  fNull) .      &&
29c0: 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54   (pOp->p1==SQLIT
29d0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
29e0: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
29f0: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
2a00: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
2a10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a20: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
2a30: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
2a40: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
2a50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2a60: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2a70: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
2a80: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
2a90: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c  ed..  ** If mall
2aa0: 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20  oc failed, then 
2ab0: 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70  the while() loop
2ac0: 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68   above may not h
2ad0: 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a  ave iterated.  *
2ae0: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  * through all op
2af0: 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f  codes and hasAbo
2b00: 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e  rt may be set in
2b10: 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72  correctly. Retur
2b20: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20  n.  ** true for 
2b30: 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65  this case to pre
2b40: 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28  vent the assert(
2b50: 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73  ) in the callers
2b60: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d   frame.  ** from
2b70: 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20   failing.  */.  
2b80: 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e  return ( v->db->
2b90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2ba0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2bb0: 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rt );.}.#endif /
2bc0: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
2bd0: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
2be0: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
2bf0: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
2c00: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
2c10: 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67   program looking
2c20: 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74   for P2 values t
2c30: 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  hat are negative
2c40: 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74  .** on jump inst
2c50: 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  ructions.  Each 
2c60: 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20  such value is a 
2c70: 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20  label.  Resolve 
2c80: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20  the.** label by 
2c90: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76  setting the P2 v
2ca0: 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72  alue to its corr
2cb0: 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ect non-zero val
2cc0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ue..**.** This r
2cd0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2ce0: 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20   once after all 
2cf0: 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65  opcodes have bee
2d00: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
2d10: 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78  * Variable *pMax
2d20: 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20  FuncArgs is set 
2d30: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  to the maximum v
2d40: 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61  alue of any P2 a
2d50: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61  rgument .** to a
2d60: 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f  n OP_Function, O
2d70: 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f  P_AggStep or OP_
2d80: 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20  VFilter opcode. 
2d90: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
2da0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d  .** sqlite3VdbeM
2db0: 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69  akeReady() to si
2dc0: 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  ze the Vdbe.apAr
2dd0: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  g[] array..**.**
2de0: 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20   The Op.opflags 
2df0: 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20  field is set on 
2e00: 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  all opcodes..*/.
2e10: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
2e20: 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65  lveP2Values(Vdbe
2e30: 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75   *p, int *pMaxFu
2e40: 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69  ncArgs){.  int i
2e50: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  ;.  int nMaxArgs
2e60: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
2e70: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
2e80: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
2e90: 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61  aLabel;.  p->rea
2ea0: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72  dOnly = 1;.  for
2eb0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2ec0: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2ed0: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2ee0: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
2ef0: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f  >opcode;..    pO
2f00: 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c  p->opflags = sql
2f10: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
2f20: 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  ty[opcode];.    
2f30: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
2f40: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
2f50: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b  e==OP_AggStep ){
2f60: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
2f70: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
2f80: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
2f90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2fa0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e  (opcode==OP_Tran
2fb0: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
2fc0: 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64 65  p2!=0) || opcode
2fd0: 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a 20  ==OP_Vacuum ){. 
2fe0: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
2ff0: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
3000: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
3010: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
3020: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3030: 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  VUpdate ){.     
3040: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
3050: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
3060: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
3070: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
3080: 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
3090: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
30a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
30b0: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
30c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
30d0: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -1].opcode==OP_I
30e0: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
30f0: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
3100: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
3110: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3120: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
3130: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
3140: 3d 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 6f 70 63  ==OP_Next || opc
3150: 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e 65  ode==OP_SorterNe
3160: 78 74 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  xt ){.      pOp-
3170: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
3180: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b  qlite3BtreeNext;
3190: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
31a0: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
31b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
31c0: 70 63 6f 64 65 3d 3d 4f 50 5f 50 72 65 76 20 29  pcode==OP_Prev )
31d0: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e  {.      pOp->p4.
31e0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
31f0: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
3200: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3210: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3220: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
3230: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
3240: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26  OPFLG_JUMP)!=0 &
3250: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
3260: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
3270: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
3280: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
3290: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
32a0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
32b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
32c0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
32d0: 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65  bel);.  p->aLabe
32e0: 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46  l = 0;..  *pMaxF
32f0: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
3300: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
3310: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
3320: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
3330: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
3340: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
3350: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
3360: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
3370: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3380: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3390: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
33a0: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
33b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
33c0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
33d0: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
33e0: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
33f0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
3400: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
3410: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
3420: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
3430: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
3440: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
3450: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
3460: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
3470: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
3480: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
3490: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
34a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
34b0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
34c0: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
34d0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
34e0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
34f0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
3500: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
3510: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
3520: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
3530: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
3540: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
3550: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
3560: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
3570: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
3580: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
3590: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
35a0: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
35b0: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
35c0: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
35d0: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
35e0: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
35f0: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
3600: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
3610: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
3620: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
3630: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
3640: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
3650: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
3660: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
3670: 61 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65  assert( p->btree
3680: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  Mask==0 );..  re
3690: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
36a0: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
36b0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
36c0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
36d0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
36e0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
36f0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
3700: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
3710: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3720: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
3730: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
3740: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
3750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3760: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
3770: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
3780: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3790: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
37a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
37b0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
37c0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
37d0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
37e0: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
37f0: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
3800: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3810: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3820: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
3830: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
3840: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
3850: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
3860: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
3870: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
3880: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3890: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
38a0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
38b0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
38c0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
38d0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
38e0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
38f0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
3900: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
3910: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
3920: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
3930: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
3940: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
3950: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
3960: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3980: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
39a0: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
39b0: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
39c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
39d0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
39e0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
39f0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
3a00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3a10: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3a20: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
3a30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
3a40: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3a50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3a60: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
3a70: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
3a80: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3a90: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3aa0: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3ab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
3ac0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
3ad0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3ae0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
3af0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3b00: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3b10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3b20: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3b30: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3b40: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3b50: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3b60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3b70: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3b80: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3b90: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3ba0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3bb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3bc0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
3bd0: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
3be0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3bf0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
3c00: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
3c10: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3c20: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
3c30: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3c40: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3c50: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
3c60: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3c70: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3c90: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
3ca0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
3cb0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
3cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3cd0: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
3ce0: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
3cf0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3d00: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
3d10: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
3d20: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3d30: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
3d40: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3d50: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3d60: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
3d70: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3d80: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
3d90: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3da0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
3db0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
3dc0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
3dd0: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
3de0: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
3df0: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
3e00: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
3e10: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3e20: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
3e30: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
3e40: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
3e50: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
3e60: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3e70: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
3e80: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
3e90: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3ea0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
3eb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3ec0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
3ed0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
3ee0: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
3ef0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3f00: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
3f10: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
3f20: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
3f30: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
3f40: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
3f50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3f60: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
3f70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
3f80: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
3f90: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
3fa0: 72 74 28 20 61 64 64 72 3e 3d 30 20 7c 7c 20 70  rt( addr>=0 || p
3fb0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3fc0: 65 64 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  ed );.  if( addr
3fd0: 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  >=0 ) sqlite3Vdb
3fe0: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
3ff0: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
4000: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
4010: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
4020: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
4030: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
4040: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
4050: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
4060: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
4070: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
4080: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
4090: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
40a0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
40b0: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c  *pDef){.  if( AL
40c0: 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70  WAYS(pDef) && (p
40d0: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
40e0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
40f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4100: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
4110: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
4120: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4130: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
4140: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
4150: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
4160: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
4170: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
4180: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
4190: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
41a0: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
41b0: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
41c0: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
41d0: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
41e0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
41f0: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
4200: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
4210: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
4220: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4230: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
4240: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
4250: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
4260: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
4270: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4280: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
4290: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
42a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
42b0: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
42c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
42d0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
42e0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
42f0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4300: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4310: 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55    case P4_VDBEFU
4320: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
4330: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
4340: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
4350: 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p4;.        free
4360: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
4370: 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d  n(db, pVdbeFunc-
4380: 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  >pFunc);.       
4390: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
43a0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
43b0: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
43c0: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
43d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
43e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
43f0: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
4400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4410: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
4420: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
4430: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4440: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
4450: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
4460: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4470: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
4480: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  EM: {.        if
4490: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
44a0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
44b0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
44c0: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
44d0: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
44e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
44f0: 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a    Mem *p = (Mem*
4500: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  )p4;.          s
4510: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4520: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
4530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4540: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
4550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4570: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
4580: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
4590: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
45a0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
45b0: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
45c0: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
45d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
45e0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
45f0: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
4600: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
4610: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
4620: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
4630: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
4640: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
4650: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
4660: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
4670: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
4680: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
4690: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
46a0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
46b0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
46c0: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
46d0: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
46e0: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
46f0: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
4700: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
4710: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
4720: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
4730: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
4740: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4750: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
4760: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
4770: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
4780: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
4790: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
47a0: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
47b0: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
47c0: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
47d0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
47e0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
47f0: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
4800: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
4810: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
4820: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
4830: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
4840: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
4850: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
4860: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
4870: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4880: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
4890: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
48a0: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
48b0: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
48c0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
48d0: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
48e0: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
48f0: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
4900: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
4910: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73  P_Noop.*/.void s
4920: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4930: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
4940: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28  int addr){.  if(
4950: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
4960: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
4970: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
4980: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4990: 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28  >db;.    freeP4(
49a0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
49b0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
49c0: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
49d0: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
49e0: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
49f0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a   = OP_Noop;.  }.
4a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4a10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4a20: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
4a30: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
4a40: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4a50: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
4a60: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
4a70: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
4a80: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4a90: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4ab0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
4ac0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
4ad0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
4ae0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
4af0: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
4b00: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4b10: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4b20: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4b30: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4b40: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4b50: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4b60: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4b70: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4b80: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4b90: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4ba0: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4bb0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
4bc0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
4bd0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
4be0: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
4bf0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
4c00: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
4c10: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
4c20: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
4c30: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
4c40: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
4c50: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
4c60: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
4c70: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4c80: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
4c90: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
4ca0: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4cb0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
4cc0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
4cd0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
4ce0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4cf0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4d00: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
4d10: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
4d20: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
4d30: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4d40: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
4d50: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
4d60: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
4d70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
4d80: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
4d90: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
4da0: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
4db0: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
4dc0: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
4dd0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
4de0: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
4df0: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
4e00: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
4e10: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
4e20: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
4e30: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
4e40: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
4e50: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
4e60: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
4e70: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
4e80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
4e90: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
4ea0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
4eb0: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
4ec0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4ed0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4ee0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
4ef0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
4f00: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
4f10: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
4f20: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4f30: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4f40: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
4f50: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4f60: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4f70: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4f80: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
4f90: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4fa0: 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e  if ( n!=P4_KEYIN
4fb0: 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  FO && n!=P4_VTAB
4fc0: 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50   ) {.      freeP
4fd0: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4fe0: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4ff0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5000: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5010: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
5020: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
5030: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
5040: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
5050: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
5060: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
5070: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
5080: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
5090: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
50a0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
50b0: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
50c0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
50d0: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
50e0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
50f0: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
5100: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
5110: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
5120: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
5130: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
5140: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
5150: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
5160: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5170: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
5180: 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20  else if( zP4==0 
5190: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
51a0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
51b0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
51c0: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
51d0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P4_KEYINFO ){
51e0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
51f0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
5200: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
5210: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
5220: 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46  eyInfo*)zP4)->nF
5230: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
5240: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
5250: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
5260: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
5270: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
5280: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
5290: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
52a0: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79 74 65  llocRaw(0, nByte
52b0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
52c0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
52d0: 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  fo;.    if( pKey
52e0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38  Info ){.      u8
52f0: 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20   *aSortOrder;.  
5300: 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72      memcpy((char
5310: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c  *)pKeyInfo, zP4,
5320: 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c 64 29   nByte - nField)
5330: 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64  ;.      aSortOrd
5340: 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  er = pKeyInfo->a
5350: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
5360: 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20   if( aSortOrder 
5370: 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  ){.        pKeyI
5380: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
5390: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
53a0: 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  *)&pKeyInfo->aCo
53b0: 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  ll[nField];.    
53c0: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
53d0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  nfo->aSortOrder,
53e0: 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69   aSortOrder, nFi
53f0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eld);.      }.  
5400: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5410: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
5420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
5430: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5440: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ed = 1;.      pO
5450: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
5460: 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  OTUSED;.    }.  
5470: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5480: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5490: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
54a0: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
54b0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
54c0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
54d0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
54e0: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    pOp->
54f0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5500: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5510: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
5520: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
5530: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
5540: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
5550: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
5560: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
5570: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
5580: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5590: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
55a0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
55b0: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
55c0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
55d0: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
55e0: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
55f0: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
5600: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
5610: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
5620: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5630: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
5640: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
5650: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
5660: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
5670: 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  the the most rec
5680: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
5690: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
56a0: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
56b0: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
56c0: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
56d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
56e0: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
56f0: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
5700: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
5710: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
5720: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
5730: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
5740: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
5750: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
5760: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
5770: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
5780: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
5790: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
57a0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
57b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
57c0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
57d0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
57e0: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
57f0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
5800: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
5810: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
5820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
5830: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
5840: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5850: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
5860: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5870: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
5880: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5890: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
58a0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
58b0: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
58c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
58d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
58e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
58f0: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
5900: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
5910: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
5920: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
5930: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
5940: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
5950: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
5960: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
5970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
5980: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5990: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
59a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
59b0: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
59c0: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
59d0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
59e0: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
59f0: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
5a00: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
5a10: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
5a20: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
5a30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5a40: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
5a50: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
5a60: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
5a70: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
5a80: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
5a90: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
5aa0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
5ab0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5ac0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
5ad0: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
5ae0: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
5af0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
5b00: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
5b10: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
5b20: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5b30: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
5b40: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
5b50: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
5b60: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
5b70: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
5b80: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
5b90: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
5ba0: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
5bb0: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
5bc0: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
5bd0: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
5be0: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
5bf0: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5c00: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5c10: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
5c20: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5c30: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
5c40: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
5c50: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
5c60: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
5c70: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
5c80: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
5c90: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
5ca0: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
5cb0: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
5cc0: 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62  lgrind..**.** Ab
5cd0: 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53  out the #ifdef S
5ce0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5cf0: 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  :  Normally, thi
5d00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
5d10: 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c  er called.** unl
5d20: 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54  ess p->nOp>0.  T
5d30: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
5d40: 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66  n the absense of
5d50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5d60: 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61  CE,.** an OP_Tra
5d70: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ce instruction i
5d80: 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65  s always inserte
5d90: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
5da0: 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73  Get() as soon as
5db0: 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69  .** a new VDBE i
5dc0: 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77  s created.  So w
5dd0: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65  e are free to se
5de0: 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70  t addr to p->nOp
5df0: 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  -1 without.** ha
5e00: 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63  ving to double-c
5e10: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5e20: 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  e that the resul
5e30: 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
5e40: 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c  e. But.** if SQL
5e50: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69  ITE_OMIT_TRACE i
5e60: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f  s defined, the O
5e70: 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74  P_Trace is omitt
5e80: 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65  ed and we do nee
5e90: 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68  d to.** check th
5ea0: 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f  e value of p->nO
5eb0: 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  p-1 before conti
5ec0: 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70  nuing..*/.VdbeOp
5ed0: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
5ee0: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
5ef0: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
5f00: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
5f10: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
5f20: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
5f30: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
5f40: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
5f50: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
5f60: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
5f70: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
5f80: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
5f90: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20  c VdbeOp dummy; 
5fa0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d   /* Ignore the M
5fb0: 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75  SVC warning abou
5fc0: 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72  t no initializer
5fd0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
5fe0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5ff0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
6000: 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65   addr<0 ){.#ifde
6010: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
6020: 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ACE.    if( p->n
6030: 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28  Op==0 ) return (
6040: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
6050: 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20  #endif.    addr 
6060: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
6070: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
6080: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
6090: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
60a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
60b0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
60c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
60d0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
60e0: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
60f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
6100: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
6110: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6120: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
6130: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
6140: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
6150: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
6160: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
6170: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
6180: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
6190: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
61a0: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
61b0: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
61c0: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
61d0: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
61e0: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
61f0: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
6200: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
6210: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
6220: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
6230: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
6240: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
6250: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
6260: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
6270: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
6280: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
6290: 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61  O_STATIC:.    ca
62a0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
62b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
62c0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
62d0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
62e0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
62f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6300: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6310: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
6320: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
6330: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
6340: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
6350: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
6360: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
6370: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
6380: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6390: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
63a0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
63b0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
63c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
63d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
63e0: 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  0(pColl->zName);
63f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
6400: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
6410: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6420: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
6430: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
6440: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
6460: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
6470: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6480: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6490: 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  der && pKeyInfo-
64a0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
64b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
64c0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
64d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
64e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
64f0: 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  emp[i], pColl->z
6500: 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20  Name,n+1);.     
6510: 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20       i += n;.   
6520: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
6530: 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +4<nTemp-6 ){.  
6540: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
6550: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c  zTemp[i],",nil",
6560: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  4);.          i 
6570: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
6580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
6590: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
65a0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
65b0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
65c0: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
65d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
65e0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
65f0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
6600: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
6610: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
6620: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6630: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6640: 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73  , "collseq(%.20s
6650: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
6660: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6670: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6680: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
6690: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
66a0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
66b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
66c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
66d0: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
66e0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
66f0: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
6700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6710: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
6720: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6730: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6740: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
6750: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
6760: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6770: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
6780: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
6790: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
67a0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64  Temp, zTemp, "%d
67b0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
67c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
67d0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
67e0: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
67f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6800: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
6810: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
6820: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
6830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6840: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
6850: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
6860: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
6870: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6880: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
6890: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
68a0: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
68b0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
68c0: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
68e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
68f0: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  emp, "%lld", pMe
6900: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
6910: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
6920: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6940: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6950: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
6960: 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  ", pMem->r);.   
6970: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6980: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
6990: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
69a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
69b0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e  nTemp, zTemp, "N
69c0: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ULL");.      }el
69d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
69e0: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
69f0: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
6a00: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
6a10: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
6a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6a30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6a40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6a50: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
6a60: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
6a70: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
6a80: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
6a90: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
6aa0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6ab0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
6ac0: 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62  ab:%p:%p", pVtab
6ad0: 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  , pVtab->pModule
6ae0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6af0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6b00: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
6b10: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
6b20: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6b30: 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72  p, zTemp, "intar
6b40: 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ray");.      bre
6b50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6b60: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
6b70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6b80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6b90: 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61  , zTemp, "progra
6ba0: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
6bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6bc0: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
6bd0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6be0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
6bf0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6c00: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
6c10: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
6c20: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
6c30: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
6c40: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
6c50: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6c60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
6c70: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
6c80: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
6c90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
6ca0: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
6cb0: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
6cc0: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
6cd0: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
6ce0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
6cf0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
6d00: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
6d10: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
6d20: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
6d30: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
6d40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
6d50: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
6d60: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
6d70: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
6d80: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
6d90: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
6da0: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
6db0: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
6dc0: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
6dd0: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
6de0: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
6df0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6e00: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
6e10: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
6e20: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
6e30: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
6e40: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
6e50: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
6e60: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
6e70: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
6e80: 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d  8 );.  p->btreeM
6e90: 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
6ea0: 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21  )1)<<i;.  if( i!
6eb0: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
6ec0: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
6ed0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
6ee0: 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  .    p->lockMask
6ef0: 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29   |= ((yDbMask)1)
6f00: 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  <<i;.  }.}..#if 
6f10: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6f20: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
6f30: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
6f40: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
6f50: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
6f60: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
6f70: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6f80: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
6f90: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
6fa0: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
6fb0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
6fc0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
6fd0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
6fe0: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
6ff0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
7000: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
7010: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
7020: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
7030: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
7040: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
7050: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
7060: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
7070: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
7080: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
7090: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
70a0: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
70b0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
70c0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
70d0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
70e0: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
70f0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
7100: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
7110: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
7120: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
7130: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
7140: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
7150: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
7160: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
7170: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
7180: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7190: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
71a0: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
71b0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
71c0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
71d0: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
71e0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
71f0: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
7200: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7210: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
7220: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
7230: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
7240: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
7250: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
7260: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
7270: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
7280: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
7290: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
72a0: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
72b0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
72c0: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
72d0: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
72e0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
72f0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
7300: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
7310: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
7320: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
7330: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
7340: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
7350: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
7360: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
7370: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
7380: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7390: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
73a0: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
73b0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
73c0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
73d0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
73e0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
73f0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
7400: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
7410: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
7420: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
7430: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
7440: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
7450: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
7460: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
7470: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
7480: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7490: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
74a0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
74b0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
74c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
74d0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
74e0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
74f0: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
7500: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
7510: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
7520: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
7530: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
7540: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76  dbeEnter()..*/.v
7550: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
7560: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
7570: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
7580: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
7590: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
75a0: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
75b0: 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d  f( p->lockMask==
75c0: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
75d0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
75e0: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
75f0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
7600: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
7610: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  b;.  for(i=0, ma
7620: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
7630: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
7640: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
7650: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b   (mask & p->lock
7660: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
7670: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
7680: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7690: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
76a0: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
76b0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
76c0: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
76d0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
76e0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
76f0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
7700: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
7710: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7720: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
7730: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
7740: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
7750: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
7760: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
7770: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
7780: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
7790: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
77a0: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
77b0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
77c0: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
77d0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
77e0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
77f0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
7800: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
7810: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
7820: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
7830: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
7840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
7850: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
7860: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
7870: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
7880: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
7890: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
78a0: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
78b0: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
78c0: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
78d0: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
78e0: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
78f0: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
7900: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7910: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
7920: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
7930: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
7940: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
7950: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
7960: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
7970: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
7980: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7990: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
79a0: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
79b0: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
79c0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
79d0: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
79e0: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
79f0: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
7a00: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7a10: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7a20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7a30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7a40: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
7a50: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
7a60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
7a70: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
7a80: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7a90: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7aa0: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7ab0: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
7ac0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
7ad0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
7ae0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
7af0: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
7b00: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
7b10: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
7b20: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
7b30: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
7b40: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
7b50: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
7b60: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
7b70: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7b80: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7b90: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7ba0: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7bb0: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7bc0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7bd0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7be0: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7bf0: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7c00: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
7c10: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
7c20: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
7c30: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
7c40: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
7c50: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
7c60: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
7c70: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7c80: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7c90: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7ca0: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7cb0: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7cc0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7cd0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7ce0: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7cf0: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7d00: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
7d10: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
7d20: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
7d30: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
7d40: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
7d50: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
7d60: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7d70: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7d80: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7d90: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7da0: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7db0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7dc0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7dd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7de0: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7df0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7e00: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7e10: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
7e20: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
7e30: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
7e40: 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20  = MEM_Invalid;. 
7e50: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
7e60: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
7e70: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
7e80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
7e90: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7ea0: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
7eb0: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
7ec0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
7ed0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
7ee0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
7ef0: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
7f00: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
7f10: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
7f20: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
7f30: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
7f40: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
7f50: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
7f60: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
7f70: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
7f80: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
7f90: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
7fa0: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
7fb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
7fc0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7fd0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
7fe0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7ff0: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
8000: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
8010: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
8020: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
8030: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8040: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
8050: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
8060: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
8070: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
8080: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
8090: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
80a0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
80b0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
80c0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
80d0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
80e0: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
80f0: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
8100: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
8110: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
8120: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
8130: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
8140: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
8150: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
8160: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
8170: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
8180: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
8190: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
81a0: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
81b0: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
81c0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
81d0: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
81e0: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
81f0: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
8200: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
8210: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8220: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
8230: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
8240: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
8250: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
8260: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
8270: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
8280: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
8290: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
82a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
82b0: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
82e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8310: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
8320: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
8330: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
8340: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8360: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
8370: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
8380: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
8390: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
83a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
83b0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
83c0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
83f0: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
8400: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
8410: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8420: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
8430: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
8440: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8450: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8480: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
8490: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
84a0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
84b0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
84c0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
84d0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
84e0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
84f0: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
8500: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
8510: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
8520: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
8530: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
8540: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
8550: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
8560: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
8570: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
8580: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8590: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
85a0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
85b0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
85c0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
85d0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
85e0: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
85f0: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
8600: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
8610: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
8620: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
8630: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
8640: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
8650: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
8660: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
8670: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
8680: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
8690: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
86a0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
86b0: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
86c0: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
86d0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
86e0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
86f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
8700: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
8710: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
8720: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
8730: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8740: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
8750: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
8760: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
8770: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
8780: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
8790: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
87a0: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
87b0: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
87c0: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
87d0: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
87e0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
87f0: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
8800: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
8810: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
8820: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
8830: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
8840: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8850: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
8860: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
8870: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
8880: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
8890: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
88a0: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
88b0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
88c0: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
88d0: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
88e0: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
88f0: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
8900: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
8910: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
8920: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
8930: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
8940: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
8950: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
8960: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
8970: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
8980: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
8990: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
89a0: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
89b0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
89c0: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
89d0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
89e0: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
89f0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
8a00: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
8a10: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
8a20: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
8a30: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
8a40: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
8a50: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
8a60: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
8a70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
8a80: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
8a90: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
8aa0: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
8ab0: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
8ac0: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
8ad0: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
8ae0: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
8af0: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
8b00: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
8b10: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
8b20: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
8b30: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
8b40: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
8b50: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
8b60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
8b70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
8b80: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
8b90: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
8ba0: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
8bb0: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
8bc0: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
8bd0: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
8be0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
8bf0: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
8c00: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
8c10: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8c20: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
8c30: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
8c40: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
8c50: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
8c60: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8c70: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
8c80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8c90: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
8ca0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
8cb0: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
8cc0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
8cd0: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
8ce0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
8cf0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
8d00: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
8d10: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
8d20: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
8d30: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
8d40: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
8d50: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
8d60: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
8d70: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
8d80: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
8d90: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
8da0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
8db0: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
8dc0: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
8dd0: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
8de0: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
8df0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
8e00: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
8e10: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
8e20: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
8e30: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
8e40: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
8e50: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
8e60: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
8e70: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
8e80: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
8e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8ea0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8eb0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8ec0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8ed0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8ee0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8ef0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
8f00: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
8f30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
8f40: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
8f50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8f60: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
8f70: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8f80: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
8f90: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
8fa0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8fb0: 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e);  /* Opcode *
8fc0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8fd0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
8fe0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
8ff0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
9000: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
9010: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
9020: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
9030: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
9040: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
9050: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
9060: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
9070: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
9080: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
9090: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
90a0: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
90b0: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
90c0: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
90d0: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
90e0: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
90f0: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
9100: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
9110: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
9120: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
9130: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
9140: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
9150: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
9160: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
9170: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
9180: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
9190: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
91a0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
91b0: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
91c0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
91d0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
91e0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
91f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9200: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
9210: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
9220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9230: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
9240: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
9250: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
9260: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
9270: 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  te, 1) ){.      
9280: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
9290: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
92a0: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
92b0: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
92c0: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
92d0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
92e0: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
92f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
9300: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
9310: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
9320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9330: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
9340: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9350: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
9360: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
9390: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
93a0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
93b0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
93c0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
93d0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
93e0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32  m->u.i = pOp->p2
93f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32             /* P2
9410: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
9420: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
9430: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
9440: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
9450: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
9460: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
9470: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9490: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P3 */.    pMem
94a0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
94b0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
94c0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
94d0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
94e0: 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b  (pMem, 32, 0) ){
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9500: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
9510: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
9520: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
9540: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
9550: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
9560: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
9570: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
9580: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
9590: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
95a0: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
95b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
95c0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
95d0: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
95e0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
95f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9600: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
9610: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
9620: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9630: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
9640: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9650: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
9660: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
9670: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
9680: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9690: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
96a0: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
96b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
96c0: 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b  w(pMem, 4, 0) ){
96d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
96e0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
96f0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
9700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
9710: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
9720: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9730: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
9740: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
9750: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
9760: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9770: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
9780: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
9790: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
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 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
97d0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
97e0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
97f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9800: 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  G.      if( pOp-
9810: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
9820: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
9830: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
9840: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
9850: 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d  m->z = pOp->zCom
9860: 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  ment;.        pM
9870: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
9880: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
9890: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
98a0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
98b0: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  8;.        pMem-
98c0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
98d0: 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  EXT;.      }else
98e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
98f0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
9900: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20  ags = MEM_Null; 
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
9930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   */.        pMem
9940: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9950: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
9960: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
9970: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
9980: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
9990: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
99a0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
99b0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
99c0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
99d0: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
99e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
99f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9a00: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
9a10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9a20: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
9a30: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
9a40: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
9a50: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
9a60: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
9a70: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
9a80: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
9a90: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
9aa0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
9ab0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
9ac0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
9ad0: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
9ae0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
9af0: 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  e && pOp->p4.z!=
9b00: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
9b10: 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34  har *z = pOp->p4
9b20: 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73  .z;.    while( s
9b30: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
9b40: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69  ) ) z++;.    pri
9b50: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
9b60: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
9b70: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
9b80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9b90: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
9ba0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
9bb0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
9bc0: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
9bd0: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
9be0: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
9bf0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
9c00: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
9c10: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
9c20: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
9c30: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
9c40: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
9c50: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
9c60: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
9c70: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
9c80: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
9c90: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
9ca0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
9cb0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
9cc0: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
9cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
9ce0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
9cf0: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
9d00: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
9d10: 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  0; sqlite3Isspac
9d20: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
9d30: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
9d40: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
9d50: 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  f( sqlite3Isspac
9d60: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
9d70: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
9d80: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
9d90: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
9da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
9db0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
9dc0: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
9dd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
9de0: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
9df0: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
9e00: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
9e10: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
9e20: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
9e30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
9e40: 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  OTRACE */../*.**
9e50: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
9e60: 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a  from a fixed siz
9e70: 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74  e buffer and ret
9e80: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9e90: 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20  .** that space. 
9ea0: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
9eb0: 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
9ec0: 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ble, return NULL
9ed0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66  ..**.** The pBuf
9ee0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
9ef0: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
9f00: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69  of a pointer whi
9f10: 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69  ch will.** recei
9f20: 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72  ve the new memor
9f30: 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d  y.  pBuf is norm
9f40: 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ally NULL.  If p
9f50: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
9f60: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
9f70: 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68  t memory space h
9f80: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
9f90: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
9fa0: 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  at.** this routi
9fb0: 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c  ne should not al
9fc0: 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d  locate any new m
9fd0: 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75  emory.  When pBu
9fe0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
9ff0: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70   simply return p
a000: 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63  Buf.  Only alloc
a010: 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73  ate new memory s
a020: 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a  pace when pBuf.*
a030: 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
a040: 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75   nByte is the nu
a050: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
a060: 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a   space needed..*
a070: 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69  *.** *ppFrom poi
a080: 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65  nts to available
a090: 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20   space and pEnd 
a0a0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e  points to the en
a0b0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69  d of the.** avai
a0c0: 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68  lable space.  Wh
a0d0: 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f  en space is allo
a0e0: 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69  cated, *ppFrom i
a0f0: 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a  s advanced past.
a100: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
a110: 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  e allocated spac
a120: 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65  e..**.** *pnByte
a130: 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66   is a counter of
a140: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
a150: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68  ytes of space th
a160: 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a  at have failed.*
a170: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20  * to allocate.  
a180: 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75  If there is insu
a190: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
a1a0: 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74  n *ppFrom to sat
a1b0: 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75  isfy the.** requ
a1c0: 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  est, then increm
a1d0: 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74  ent *pnByte by t
a1e0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
a1f0: 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61   request..*/.sta
a200: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
a210: 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42  pace(.  void *pB
a220: 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf,          /* 
a230: 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69  Where return poi
a240: 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f  nter will be sto
a250: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  red */.  int nBy
a260: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
a270: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a280: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
a290: 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20    u8 **ppFrom,  
a2a0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
a2b0: 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20  : Allocate from 
a2c0: 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20  *ppFrom */.  u8 
a2d0: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
a2e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a2f0: 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
a300: 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62  end of *ppFrom b
a310: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  uffer */.  int *
a320: 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20  pnByte          
a330: 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  /* If allocation
a340: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c   cannot be made,
a350: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
a360: 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  te */.){.  asser
a370: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
a380: 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29  IGNMENT(*ppFrom)
a390: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29   );.  if( pBuf )
a3a0: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20   return pBuf;.  
a3b0: 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e  nByte = ROUND8(n
a3c0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a  Byte);.  if( &(*
a3d0: 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c  ppFrom)[nByte] <
a3e0: 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42  = pEnd ){.    pB
a3f0: 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46  uf = (void*)*ppF
a400: 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d  rom;.    *ppFrom
a410: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c   += nByte;.  }el
a420: 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20  se{.    *pnByte 
a430: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20  += nByte;.  }.  
a440: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
a450: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
a460: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
a470: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
a480: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
a490: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
a4a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
a4b0: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
a4c0: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
a4d0: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
a4e0: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
a4f0: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
a500: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
a510: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a520: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
a530: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
a540: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
a550: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
a560: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
a570: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
a580: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
a590: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
a5a0: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
a5b0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
a5c0: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
a5d0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
a5e0: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
a5f0: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
a600: 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =1; i<p->nMem; i
a610: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
a620: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
a630: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
a640: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
a650: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
a660: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
a670: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
a680: 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  rt;.  p->magic =
a690: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
a6a0: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
a6b0: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
a6c0: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
a6d0: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
a6e0: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
a6f0: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
a700: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
a710: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
a720: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
a730: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
a740: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
a750: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
a760: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
a770: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
a780: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
a790: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
a7a0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
a7b0: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
a7c0: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
a7d0: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
a7e0: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
a7f0: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
a800: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
a810: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20  ing stack space 
a820: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
a830: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
a840: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
a850: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
a860: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
a870: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
a880: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
a890: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
a8a0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
a8b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
a8c0: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61  ay be called exa
a8d0: 63 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63  ct once on a eac
a8e0: 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  h virtual machin
a8f0: 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  e..** After this
a900: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a910: 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  ed the VM has be
a920: 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e  en "packaged" an
a930: 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f  d is ready.** to
a940: 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69   run.  After thi
a950: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a960: 6c 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c  led, futher call
a970: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
a980: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
a990: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
a9a0: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
a9b0: 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
a9c0: 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
a9d0: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
a9e0: 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
a9f0: 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
aa00: 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
aa10: 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
aa20: 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
aa30: 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
aa40: 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
aa50: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
aa60: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
aa70: 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
aa80: 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
aa90: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
aaa0: 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
aab0: 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
aac0: 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
aad0: 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
aae0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
aaf0: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
ab20: 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
ab30: 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
ab40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ab50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
ab60: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
ab90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
aba0: 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
abd0: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
abe0: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
abf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ac00: 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
ac10: 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
ac20: 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
ac50: 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
ac60: 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
ac90: 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
aca0: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
acb0: 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20   nOnce;         
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
acd0: 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65  umber of OP_Once
ace0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f   instructions */
acf0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad10: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ad20: 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b  r */.  u8 *zCsr;
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad40: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
ad50: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
ad60: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  location */.  u8
ad70: 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *zEnd;         
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad90: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
ada0: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
adb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68       /* How much
ade0: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73   extra memory is
adf0: 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73   needed */..  as
ae00: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
ae10: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
ae20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ae30: 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
ae40: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
ae50: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
ae60: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
ae70: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
ae80: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
ae90: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
aea0: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
aeb0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
aec0: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
aed0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
aee0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
aef0: 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61  g;.  nOnce = pPa
af00: 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66  rse->nOnce;.  if
af10: 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e  ( nOnce==0 ) nOn
af20: 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72  ce = 1; /* Ensur
af30: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  e at least one b
af40: 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46  yte in p->aOnceF
af50: 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a  lag[] */.  .  /*
af60: 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   For each cursor
af70: 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20   required, also 
af80: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72  allocate a memor
af90: 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20  y cell. Memory. 
afa0: 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b   ** cells (nMem+
afb0: 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d  1-nCursor)..nMem
afc0: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c  , inclusive, wil
afd0: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  l never be used 
afe0: 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65  by.  ** the vdbe
aff0: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61   program. Instea
b000: 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  d they are used 
b010: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
b020: 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43  e for.  ** VdbeC
b030: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
b040: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
b050: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
b060: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
b070: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
b080: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
b090: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
b0a0: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
b0b0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
b0c0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
b0d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b0e0: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
b0f0: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
b100: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
b110: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
b120: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
b130: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
b140: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67  e for memory reg
b150: 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69  isters, SQL vari
b160: 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73  ables, VDBE curs
b170: 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e  ors and .  ** an
b180: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61   array to marsha
b190: 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  l SQL function a
b1a0: 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a  rguments in..  *
b1b0: 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29  /.  zCsr = (u8*)
b1c0: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
b1d0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
b1e0: 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61   avaliable for a
b1f0: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a  llocation */.  z
b200: 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  End = (u8*)&p->a
b210: 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b  Op[p->nOpAlloc];
b220: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
b230: 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72  past end of zCsr
b240: 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65  [] */..  resolve
b250: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
b260: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
b270: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
b280: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
b290: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
b2a0: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
b2b0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
b2c0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
b2d0: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
b2e0: 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c  }.  memset(zCsr,
b2f0: 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a   0, zEnd-zCsr);.
b300: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
b310: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61  - (u8*)0)&7;.  a
b320: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
b330: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
b340: 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  ) );.  p->expire
b350: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
b360: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
b370: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
b380: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
b390: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a  llocated in two.
b3a0: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
b3b0: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
b3c0: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
b3d0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
b3e0: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
b3f0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
b400: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
b410: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
b420: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
b430: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
b440: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
b450: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
b460: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
b470: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
b480: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20  ill in the rest 
b490: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c  using a fresh al
b4a0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
b4b0: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
b4c0: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
b4d0: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
b4e0: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
b4f0: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
b500: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
b510: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
b520: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
b530: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
b540: 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68  y.  ** reduce th
b550: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
b560: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65  ry held by a pre
b570: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
b580: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20  .  */.  do {.   
b590: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   nByte = 0;.    
b5a0: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
b5b0: 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  pace(p->aMem, nM
b5c0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  em*sizeof(Mem), 
b5d0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b5e0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  yte);.    p->aVa
b5f0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
b600: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
b610: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
b620: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b630: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
b640: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41  llocSpace(p->apA
b650: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
b660: 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  Mem*), &zCsr, zE
b670: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b680: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
b690: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
b6a0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
b6b0: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
b6c0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b6d0: 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
b6e0: 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e  pace(p->apCsr, n
b6f0: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
b700: 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20  beCursor*),.    
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e        &zCsr, zEn
b730: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b740: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61  p->aOnceFlag = a
b750: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e  llocSpace(p->aOn
b760: 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26  ceFlag, nOnce, &
b770: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
b780: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  te);.    if( nBy
b790: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  te ){.      p->p
b7a0: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
b7b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
b7c0: 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
b7d0: 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65   zCsr = p->pFree
b7e0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43  ;.    zEnd = &zC
b7f0: 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68  sr[nByte];.  }wh
b800: 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64  ile( nByte && !d
b810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b820: 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  );..  p->nCursor
b830: 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b   = (u16)nCursor;
b840: 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  p->nOnceFlag 
b850: 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70  = nOnce;.  if( p
b860: 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  ->aVar ){.    p-
b870: 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
b880: 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Var;.    for(n=0
b890: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
b8a0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b8b0: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
b8c0: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  l;.      p->aVar
b8d0: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
b8e0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
b8f0: 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  azVar ){.    p->
b900: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
b910: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
b920: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
b930: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
b940: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
b950: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
b960: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
b970: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
b980: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
b990: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
b9a0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
b9b0: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
b9c0: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
b9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
b9e0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
b9f0: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
ba00: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
ba20: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
ba30: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
ba40: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
ba50: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
ba60: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
ba70: 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20  MEM_Invalid;.   
ba80: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
ba90: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
baa0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
bab0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
bac0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
bad0: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
bae0: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
baf0: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
bb00: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
bb10: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
bb20: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
bb30: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
bb40: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
bb50: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
bb60: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
bb70: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
bb80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
bb90: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
bba0: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43  rClose(p->db, pC
bbb0: 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  x);.  if( pCx->p
bbc0: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
bbd0: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
bbe0: 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68  >pBt);.    /* Th
bbf0: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77  e pCx->pCursor w
bc00: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74  ill be close aut
bc10: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69  omatically, if i
bc20: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20  t exists, by.   
bc30: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
bc40: 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ve. */.  }else i
bc50: 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  f( pCx->pCursor 
bc60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
bc70: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
bc80: 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
bc90: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
bca0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
bcb0: 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56  LE.  if( pCx->pV
bcc0: 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  tabCursor ){.   
bcd0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
bce0: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
bcf0: 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75  r = pCx->pVtabCu
bd00: 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  rsor;.    const 
bd10: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
bd20: 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70  pModule = pCx->p
bd30: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
bd40: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
bd50: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
bd60: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
bd70: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
bd80: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
bd90: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
bda0: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
bdb0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
bdc0: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
bdd0: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
bde0: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
bdf0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
be00: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
be10: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
be20: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
be30: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
be40: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
be50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
be60: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
be70: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
be80: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
be90: 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63  me->v;.  v->aOnc
bea0: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
beb0: 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  aOnceFlag;.  v->
bec0: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  nOnceFlag = pFra
bed0: 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->nOnceFlag;. 
bee0: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
bef0: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
bf00: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
bf10: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
bf20: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
bf30: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
bf40: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
bf50: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
bf60: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
bf70: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
bf80: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
bf90: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
bfa0: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
bfb0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
bfc0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
bfd0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
bfe0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
bff0: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
c000: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
c010: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
c020: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
c030: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
c040: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
c050: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
c060: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
c070: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
c080: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
c090: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
c0a0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
c0b0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
c0c0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
c0d0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
c0e0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
c0f0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
c100: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
c110: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
c120: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
c130: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
c140: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
c150: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
c160: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
c170: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
c180: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
c190: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
c1a0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
c1b0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
c1c0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
c1d0: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
c1e0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
c1f0: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
c200: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
c210: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
c220: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
c230: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
c240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
c250: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
c260: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
c270: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
c280: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c290: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
c2a0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c2b0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
c2c0: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
c2d0: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
c2e0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
c2f0: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
c300: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
c310: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
c320: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
c330: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
c340: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
c350: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
c360: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
c370: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
c380: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c390: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
c3a0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
c3b0: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
c3c0: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
c3d0: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
c3e0: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
c3f0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
c400: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
c410: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
c420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c430: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
c440: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c450: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
c460: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
c470: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
c480: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
c490: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
c4a0: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
c4b0: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
c4c0: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
c4d0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
c4e0: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
c4f0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
c500: 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
c510: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
c520: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
c530: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
c540: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
c550: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
c560: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
c570: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
c580: 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61  .flags==MEM_Inva
c590: 6c 69 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lid );.  }.#endi
c5a0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
c5b0: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
c5c0: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
c5d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
c5e0: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
c5f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
c600: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
c610: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
c620: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
c630: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
c640: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
c650: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
c660: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
c670: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
c680: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
c690: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
c6a0: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
c6b0: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
c6c0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
c6d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
c6e0: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
c6f0: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
c700: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
c710: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
c720: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
c730: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
c740: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c750: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
c760: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c770: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
c780: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
c790: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
c7a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
c7b0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
c7c0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c7d0: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
c7e0: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
c7f0: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
c800: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
c810: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
c820: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
c830: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
c840: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
c850: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
c860: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
c870: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
c880: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
c890: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
c8a0: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
c8b0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
c8c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
c8d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c8e0: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
c8f0: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
c900: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
c910: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
c920: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
c930: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
c940: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
c950: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
c960: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
c970: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
c980: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
c990: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
c9a0: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
c9b0: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
c9c0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
c9d0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
c9e0: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
c9f0: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
ca00: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
ca10: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
ca20: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
ca30: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
ca40: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
ca50: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
ca60: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
ca70: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ca80: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ca90: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
cac0: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
cad0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
cb00: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
cb10: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
cb20: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb40: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
cb50: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
cb60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
cb70: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
cb80: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
cb90: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
cba0: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
cbb0: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
cbc0: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
cbd0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
cbe0: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
cbf0: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
cc00: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
cc10: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
cc20: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
cc30: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
cc40: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
cc50: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
cc60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
cc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
cc80: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
cc90: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
cca0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ccb0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
ccc0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
ccd0: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
cce0: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
ccf0: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
cd00: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
cd10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
cd20: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
cd30: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
cd40: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
cd50: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
cd60: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
cd70: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
cd80: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
cd90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cda0: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
cdb0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
cdc0: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
cdd0: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
cde0: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
cdf0: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
ce00: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
ce10: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
ce20: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
ce30: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
ce40: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
ce50: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
ce60: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
ce70: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
ce80: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
ce90: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
cea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
ceb0: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
cec0: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
ced0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
cee0: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
cef0: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
cf00: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
cf10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
cf20: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
cf30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
cf40: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
cf50: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
cf60: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
cf70: 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
cf80: 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
cf90: 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
cfa0: 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
cfb0: 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
cfc0: 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
cfd0: 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
cfe0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
cff0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
d000: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
d010: 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
d020: 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
d030: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
d040: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
d050: 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
d060: 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
d070: 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
d080: 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
d090: 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
d0a0: 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
d0b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d0c0: 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
d0d0: 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
d0e0: 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
d0f0: 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
d100: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
d110: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
d120: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
d130: 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
d140: 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a   &p->zErrMsg);..
d150: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
d160: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
d170: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
d180: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
d190: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
d1a0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
d1b0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
d1c0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
d1d0: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
d1e0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
d1f0: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
d200: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
d210: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
d220: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
d230: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
d240: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
d250: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
d260: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
d270: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
d280: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
d290: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
d2a0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d2b0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d2c0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
d2d0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d2e0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d2f0: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
d300: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
d310: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
d320: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
d330: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
d340: 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ++;.      rc = s
d350: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
d360: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
d370: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
d380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d390: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d3a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
d3b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d3c0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
d3d0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
d3e0: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
d3f0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
d400: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
d410: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
d420: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
d430: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
d440: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
d450: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
d460: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d480: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
d490: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
d4a0: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
d4b0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
d4c0: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
d4d0: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
d4e0: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
d4f0: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
d500: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
d510: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
d520: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
d530: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
d540: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
d550: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
d560: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
d570: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
d580: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
d590: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
d5a0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
d5b0: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
d5c0: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
d5d0: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
d5e0: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
d5f0: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
d600: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
d610: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
d620: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
d630: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
d640: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
d650: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
d660: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
d670: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
d680: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
d690: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
d6a0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d6b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
d6c0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
d6d0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
d6e0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
d6f0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
d700: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
d710: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
d720: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d730: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
d740: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
d750: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
d760: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
d770: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
d780: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
d790: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
d7a0: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
d7b0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
d7c0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
d7d0: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
d7e0: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
d7f0: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
d800: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
d810: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
d820: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
d830: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
d840: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d850: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
d860: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
d870: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d880: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d890: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d8a0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d8b0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d8c0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d8d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d8e0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d8f0: 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
d900: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d910: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d920: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
d930: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
d940: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d950: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
d960: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
d970: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
d980: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
d990: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
d9a0: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
d9b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d9c0: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
d9d0: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
d9e0: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
d9f0: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
da00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
da10: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
da20: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
da30: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
da40: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
da50: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
da60: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
da70: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
da80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
da90: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
daa0: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
dab0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
dac0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
dad0: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
dae0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
daf0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
db00: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
db10: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
db20: 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
db30: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
db40: 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
db50: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
db60: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
db70: 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
db80: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
db90: 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
dba0: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
dbb0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
dbc0: 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
dbd0: 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
dbe0: 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
dbf0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
dc00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a  NOMEM;.    do {.
dc10: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
dc20: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
dc30: 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
dc40: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
dc50: 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
dc60: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
dc70: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
dc80: 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
dc90: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
dca0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
dcb0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
dcc0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
dcd0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
dce0: 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
dcf0: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
dd00: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
dd10: 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
dd20: 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
dd30: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
dd40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
dd50: 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
dd60: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
dd70: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
dd80: 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
dd90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
dda0: 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
ddb0: 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
ddc0: 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
ddd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
de00: 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
de10: 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
de20: 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
de30: 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
de40: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
de50: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
de60: 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
de70: 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
de80: 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
de90: 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
dea0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
deb0: 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
dec0: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
ded0: 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
dee0: 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
def0: 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
df00: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
df10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
df20: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
df30: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
df40: 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
df50: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
df60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df70: 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
df80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
df90: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
dfa0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
dfb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
dfc0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
dfd0: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
dfe0: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
dff0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
e000: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
e010: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
e020: 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
e030: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
e040: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
e050: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
e060: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
e070: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e080: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e090: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e0a0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
e0b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e0c0: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
e0d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
e0e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
e0f0: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
e100: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
e110: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
e120: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
e130: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
e140: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
e150: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
e160: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
e170: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
e180: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
e190: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
e1a0: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
e1b0: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
e1c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
e1d0: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
e1e0: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
e1f0: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
e200: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
e210: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
e220: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e230: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
e240: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e250: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e260: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e270: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
e280: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
e290: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
e2a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
e2b0: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
e2c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
e2d0: 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
e2e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
e2f0: 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
e300: 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
e310: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
e320: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
e330: 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
e340: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
e350: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
e360: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
e370: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
e380: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
e390: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
e3a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e3b0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
e3c0: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
e3d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
e3e0: 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
e3f0: 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
e400: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e410: 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
e420: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e430: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e440: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
e450: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
e460: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e470: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
e480: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
e490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e4a0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
e4b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
e4c0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
e4d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e4e0: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
e4f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e500: 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
e510: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
e520: 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
e530: 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
e540: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
e550: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
e560: 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d  Sync .     && 0=
e570: 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
e580: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
e590: 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
e5a0: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
e5b0: 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
e5c0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
e5d0: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
e5e0: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
e5f0: 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
e600: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
e610: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
e620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
e630: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
e640: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
e650: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e660: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e670: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e680: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
e690: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
e6a0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
e6b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
e6c0: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
e6d0: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
e6e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
e6f0: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
e700: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
e710: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
e720: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
e730: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
e740: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e750: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
e760: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
e770: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
e780: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
e790: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
e7a0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e7b0: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
e7c0: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
e7d0: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
e7e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e7f0: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
e800: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
e810: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
e820: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
e830: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e840: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
e850: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e860: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
e870: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
e880: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
e890: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e8a0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e8b0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
e8c0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
e8d0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e8e0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e8f0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e900: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
e910: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e920: 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
e930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e940: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e950: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
e960: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
e970: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
e980: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e990: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e9a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e9b0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
e9c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e9d0: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
e9e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e9f0: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
ea00: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
ea10: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
ea20: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
ea30: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
ea40: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
ea50: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
ea60: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
ea70: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
ea80: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
ea90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eaa0: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
eab0: 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
eac0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ead0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
eae0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
eaf0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
eb00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
eb10: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
eb20: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
eb30: 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
eb40: 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
eb50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
eb60: 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
eb70: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
eb80: 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
eb90: 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
eba0: 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
ebb0: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
ebc0: 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
ebd0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
ebe0: 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
ebf0: 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
ec00: 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
ec10: 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
ec20: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
ec30: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
ec40: 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
ec50: 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
ec60: 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
ec70: 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
ec80: 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
ec90: 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
eca0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
ecb0: 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
ecc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
ecd0: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
ece0: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
ecf0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
ed00: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
ed10: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
ed20: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
ed30: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
ed40: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ed50: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
ed60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
ed70: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
ed80: 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
ed90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
eda0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
edb0: 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
edc0: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
edd0: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
ede0: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
edf0: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
ee00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ee10: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
ee20: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
ee30: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
ee40: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
ee50: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
ee60: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
ee70: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
ee80: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
ee90: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
eea0: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
eeb0: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
eec0: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
eed0: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
eee0: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
eef0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
ef00: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
ef10: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
ef20: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
ef30: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
ef40: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
ef50: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
ef60: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
ef70: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
ef80: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
ef90: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
efa0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
efb0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
efc0: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
efd0: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
efe0: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
eff0: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
f000: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
f010: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
f020: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
f030: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
f040: 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
f050: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
f060: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
f070: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
f080: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
f090: 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
f0a0: 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  e==db->writeVdbe
f0b0: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
f0c0: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
f0d0: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
f0e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65  dif../*.** For e
f0f0: 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20  very Btree that 
f100: 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  in database conn
f110: 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20  ection db which 
f120: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  .** has been mod
f130: 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72  ified, "trip" or
f140: 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68   invalidate each
f150: 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68   cursor in.** th
f160: 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68  at Btree might h
f170: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
f180: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75  d so that the cu
f190: 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65  rsor.** can neve
f1a0: 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e  r be used again.
f1b0: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77    This happens w
f1c0: 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  hen a rollback.*
f1d0: 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68  ** occurs.  We h
f1e0: 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20  ave to trip all 
f1f0: 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  the other cursor
f200: 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f  s, even.** curso
f210: 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73  r from other VMs
f220: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61   in different da
f230: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
f240: 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e  ns,.** so that n
f250: 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20  one of them try 
f260: 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20  to use the data 
f270: 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  at which they.**
f280: 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61   were pointing a
f290: 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79  nd which now may
f2a0: 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67   have been chang
f2b0: 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65  ed due.** to the
f2c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
f2d0: 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61   Remember that a
f2e0: 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65   rollback can de
f2f0: 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70  lete tables comp
f300: 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72  lete and.** reor
f310: 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20  der rootpages.  
f320: 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  So it is not suf
f330: 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20  ficient just to 
f340: 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74  save.** the stat
f350: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
f360: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
f370: 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
f380: 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  or.** so that it
f390: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
f3a0: 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gain..*/.static 
f3b0: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
f3c0: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
f3d0: 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a  Btrees(sqlite3 *
f3e0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
f3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f400: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
f410: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
f420: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
f430: 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72   p && sqlite3Btr
f440: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
f450: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
f460: 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
f470: 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f  rs(p, SQLITE_ABO
f480: 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  RT);.    }.  }.}
f490: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
f4a0: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
f4b0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
f4c0: 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
f4d0: 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
f4e0: 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
f4f0: 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
f500: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
f510: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f520: 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
f530: 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
f540: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
f550: 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
f560: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
f570: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
f580: 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
f590: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
f5a0: 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
f5b0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
f5c0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
f5d0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
f5e0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f5f0: 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
f600: 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
f610: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
f620: 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
f630: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
f640: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
f650: 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
f660: 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
f670: 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
f680: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
f690: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
f6a0: 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
f6b0: 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
f6c0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
f6d0: 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
f6e0: 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
f6f0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
f700: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
f710: 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
f720: 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
f730: 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
f740: 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
f750: 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e   occured, causin
f760: 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
f770: 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
f780: 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
f790: 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
f7a0: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
f7b0: 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
f7c0: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
f7d0: 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
f7e0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
f7f0: 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
f800: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
f810: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
f820: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
f830: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
f840: 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
f850: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
f860: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
f870: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
f880: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
f890: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
f8a0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
f8b0: 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
f8c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f8d0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
f8e0: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
f8f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
f900: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
f910: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
f920: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
f930: 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
f940: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f950: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
f960: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
f970: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
f980: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
f990: 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
f9a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f9b0: 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
f9c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f9d0: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
f9e0: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
f9f0: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
fa00: 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
fa10: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
fa20: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
fa30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fa40: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
fa50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fa60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
fa70: 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
fa80: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
fa90: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
faa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fab0: 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
fac0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
fad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fae0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
faf0: 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
fb00: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
fb10: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
fb20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
fb30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fb40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fb50: 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
fb60: 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
fb70: 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
fb80: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
fb90: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
fba0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
fbb0: 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
fbc0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
fbd0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
fbe0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
fbf0: 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
fc00: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
fc10: 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
fc20: 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
fc30: 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
fc40: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
fc50: 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
fc60: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
fc70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
fc80: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
fc90: 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
fca0: 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
fcb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
fcc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
fcd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
fce0: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
fcf0: 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
fd00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
fd10: 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
fd20: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
fd30: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
fd40: 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
fd50: 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
fd60: 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
fd70: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
fd80: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
fd90: 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
fda0: 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
fdb0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
fdc0: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
fdd0: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
fde0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
fdf0: 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
fe00: 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
fe10: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
fe20: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
fe30: 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
fe40: 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
fe50: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
fe60: 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72  d write.** an er
fe70: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
fe80: 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
fe90: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
fea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
feb0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
fec0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
fed0: 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
fee0: 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
fef0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ff00: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
ff10: 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65  erred && db->nDe
ff20: 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c  ferredCons>0) ||
ff30: 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
ff40: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
ff50: 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  0) ){.    p->rc 
ff60: 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
ff70: 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  INT;.    p->erro
ff80: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
ff90: 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rt;.    sqlite3S
ffa0: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
ffb0: 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69  rMsg, db, "forei
ffc0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
ffd0: 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
ffe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
fff0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
10000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
10010 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
10020 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
10030 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
10040 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
10050 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
10060 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
10070 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
10080 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
10090 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
100a0 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
100b0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
100c0 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
100d0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
100e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
100f0 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
10100 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
10110 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
10120 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
10130 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
10140 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
10150 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
10160 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
10170 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
10180 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
10190 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
101a0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
101b0 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
101c0 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
101d0 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
101e0 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
101f0 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
10200 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
10210 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
10220 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
10230 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
10240 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
10250 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
10260 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
10270 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
10280 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
102b0 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
102c0 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
102d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
102e0 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
102f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
10300 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
10310 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
10320 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
10330 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
10340 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
10350 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
10360 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
10370 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
10380 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
10390 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
103a0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
103b0 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
103c0 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
103d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
103e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
103f0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
10400 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
10410 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
10420 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
10430 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
10440 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
10450 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
10460 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
10470 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
10480 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
10490 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
104a0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
104b0 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
104c0 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
104d0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
104e0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
104f0 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
10500 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
10510 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
10520 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10530 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
10540 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
10550 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46  .  if( p->aOnceF
10560 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e  lag ) memset(p->
10570 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d  aOnceFlag, 0, p-
10580 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63  >nOnceFlag);.  c
10590 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
105a0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
105b0 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
105c0 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
105d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
105e0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
105f0 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
10600 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
10610 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
10620 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
10630 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66   started */.  if
10640 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
10650 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
10660 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
10670 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
10680 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
10690 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
106a0 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
106b0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
106c0 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
106d0 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
106e0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
106f0 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
10700 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
10710 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
10720 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
10730 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
10740 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
10750 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
10760 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
10770 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74  0xff;.    assert
10780 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
10790 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
107a0 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
107b0 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73  no longer exists
107c0 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61   */.    isSpecia
107d0 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
107e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
107f0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
10820 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
10830 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
10840 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
10850 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
10860 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
10870 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
10880 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
10890 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
108a0 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
108b0 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
108c0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
108d0 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
108e0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
108f0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
10900 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
10910 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
10920 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
10930 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
10940 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
10950 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10960 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
10970 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
10980 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
10990 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
109a0 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
109b0 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
109c0 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
109d0 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
109e0 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
109f0 6f 63 63 75 72 65 64 20 77 68 69 6c 65 20 77 72  occured while wr
10a00 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
10a10 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
10a20 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
10a30 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
10a40 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
10a50 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
10a60 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
10a70 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
10a80 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
10a90 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
10aa0 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
10ab0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
10ac0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
10ad0 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
10ae0 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
10af0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
10b00 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
10b10 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
10b20 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
10b30 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
10b40 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
10b50 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
10b60 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
10b70 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
10b80 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
10b90 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
10ba0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10bb0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
10bc0 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
10bd0 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
10be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
10bf0 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
10c00 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
10c10 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
10c20 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
10c30 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
10c40 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
10c50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
10c60 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
10c70 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
10c80 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
10c90 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10ca0 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
10cb0 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
10cc0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
10cd0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
10ce0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
10cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10d00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10d10 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
10d20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
10d30 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
10d40 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
10d60 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
10d70 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
10d80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
10d90 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
10da0 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
10db0 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
10dc0 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
10dd0 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
10de0 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
10df0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
10e00 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
10e10 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
10e20 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
10e30 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
10e40 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
10e50 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
10e60 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
10e70 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
10e80 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
10e90 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
10ea0 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
10eb0 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
10ec0 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
10ed0 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70  writeVdbeCnt==(p
10ee0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
10ef0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
10f00 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
10f10 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
10f20 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
10f30 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
10f40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
10f50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
10f60 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
10f70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10f90 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
10fa0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
10fb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10fc0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
10fd0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10fe0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
10ff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11010 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
11020 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
11030 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
11040 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
11050 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
11060 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
11070 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
11080 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
11090 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
110a0 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
110b0 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
110c0 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
110d0 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
110e0 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
110f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
11100 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
11110 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
11120 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
11130 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
11140 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
11150 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
11160 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11170 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
11180 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
11190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
111a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
111b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
111c0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
111d0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
111e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
111f0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
11200 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11210 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
11220 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
11230 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
11240 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
11250 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
11260 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
11270 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
11280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
112a0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
112b0 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
112c0 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
112d0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
112e0 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
112f0 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
11300 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
11310 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
11320 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
11330 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
11340 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
11350 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
11360 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
11370 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
11380 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
11390 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
113a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
113b0 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
113c0 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
113d0 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
113e0 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a  fiedBtrees(db);.
113f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11400 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
11410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
11420 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
11430 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
11440 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
11450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11460 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
11470 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
11480 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
11490 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
114a0 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
114b0 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
114c0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
114d0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
114e0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
114f0 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
11500 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
11510 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
11520 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
11530 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
11540 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
11550 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
11560 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11570 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
11580 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
11590 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
115a0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
115b0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
115c0 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
115d0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
115e0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
115f0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
11600 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
11610 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
11620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11630 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
11640 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
11650 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
11660 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11670 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
11680 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
11690 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
116a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
116b0 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
116c0 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
116d0 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
116e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
116f0 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
11700 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
11710 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
11720 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
11730 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
11740 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
11750 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
11760 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
11770 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
11780 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
11790 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
117a0 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
117b0 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
117c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
117d0 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
117e0 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
117f0 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
11800 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
11810 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
11820 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
11830 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
11840 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
11850 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
11860 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
11870 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
11880 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
11890 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
118a0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
118b0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
118c0 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
118d0 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
118e0 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
118f0 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
11900 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
11910 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
11920 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
11930 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
11940 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
11950 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
11960 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 64 62 2d  , -1);.      db-
11970 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
11980 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
11990 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
119a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
119b0 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
119c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
119d0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
119e0 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
119f0 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
11a00 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
11a10 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
11a20 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
11a30 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
11a40 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d  ->activeVdbeCnt-
11a50 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
11a60 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
11a70 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
11a80 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t--;.    }.    a
11a90 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76  ssert( db->activ
11aa0 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72  eVdbeCnt>=db->wr
11ab0 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20  iteVdbeCnt );.  
11ac0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
11ad0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
11ae0 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
11af0 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
11b00 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
11b10 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
11b20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
11b40 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
11b50 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
11b60 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
11b70 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
11b80 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
11b90 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
11ba0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
11bb0 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
11bc0 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
11bd0 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
11be0 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
11bf0 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
11c00 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
11c10 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
11c20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
11c30 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
11c40 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
11c50 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56  ert( db->activeV
11c60 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e  dbeCnt>0 || db->
11c70 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
11c80 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
11c90 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
11ca0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
11cb0 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
11cc0 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
11cd0 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
11ce0 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
11cf0 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
11d00 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
11d10 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
11d20 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
11d30 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
11d40 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
11d50 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
11d60 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
11d70 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
11d80 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
11d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11da0 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72  *.** Copy the er
11db0 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
11dc0 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e  or message belon
11dd0 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45  ging to the VDBE
11de0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
11df0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
11e00 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65   to its database
11e10 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74   handle (so that
11e20 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a   they will be .*
11e30 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61  * returned by ca
11e40 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  lls to sqlite3_e
11e50 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c  rrcode() and sql
11e60 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a  ite3_errmsg())..
11e70 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
11e80 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65  ion does not cle
11e90 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f  ar the VDBE erro
11ea0 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67  r code or messag
11eb0 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65  e, just.** copie
11ec0 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61  s them to the da
11ed0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
11ee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
11ef0 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56  eTransferError(V
11f00 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
11f10 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11f20 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
11f30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d  ;.  if( p->zErrM
11f40 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c  sg ){.    u8 mal
11f50 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e  locFailed = db->
11f60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
11f70 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
11f80 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11f90 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
11fa0 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
11fb0 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
11fc0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
11fd0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11fe0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
11ff0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
12000 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12010 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  d = mallocFailed
12020 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64  ;.    db->errCod
12030 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  e = rc;.  }else{
12040 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12050 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20  r(db, rc, 0);.  
12060 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12070 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
12080 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
12090 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
120a0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
120b0 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
120c0 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
120d0 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
120e0 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
120f0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
12100 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
12110 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
12120 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
12130 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
12140 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
12150 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
12160 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
12170 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
12180 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
12190 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
121a0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
121b0 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
121c0 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
121d0 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
121e0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
121f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12200 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
12210 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12220 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
12230 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
12240 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
12250 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
12260 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
12270 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
12280 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
12290 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
122a0 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
122b0 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
122c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
122d0 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f  dbeHalt(p);..  /
122e0 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61  * If the VDBE ha
122f0 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61  s be run even pa
12300 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72  rtially, then tr
12310 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72  ansfer the error
12320 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65   code.  ** and e
12330 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
12340 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20  m the VDBE into 
12350 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
12360 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75  e structure.  Bu
12370 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44  t.  ** if the VD
12380 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  BE has just been
12390 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20   set to run but 
123a0 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  has not actually
123b0 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20   executed any.  
123c0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
123d0 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d  yet, leave the m
123e0 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72  ain database err
123f0 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  or information u
12400 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
12410 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
12420 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12430 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
12440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
12450 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
12460 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
12470 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
12480 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
12490 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
124a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
124b0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
124c0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
124d0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
124e0 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
124f0 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
12500 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
12510 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
12520 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
12530 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
12540 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
12550 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
12560 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
12570 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
12580 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
12590 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
125a0 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
125b0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
125c0 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
125d0 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
125e0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
125f0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
12600 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12610 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
12620 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
12630 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
12640 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
12650 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
12660 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
12670 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
12680 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
12690 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
126a0 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
126b0 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
126c0 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
126d0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
126e0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
126f0 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
12700 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
12710 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
12720 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
12730 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
12740 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
12750 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
12760 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
12770 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
12780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12790 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
127a0 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
127b0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
127c0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
127d0 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30  tf(out, "%6d %10
127e0 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20  lld %8lld ",.   
127f0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
12800 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
12810 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
12820 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
12830 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
12840 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
12850 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
12860 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
12870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12880 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
12890 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
128a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
128b0 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
128c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
128d0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
128e0 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
128f0 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
12900 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
12910 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
12920 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
12930 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
12940 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
12950 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
12960 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
12970 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
12980 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
12990 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
129a0 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
129b0 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
129c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
129d0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
129e0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
129f0 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
12a00 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
12a10 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
12a20 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
12a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12a40 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
12a50 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
12a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
12a70 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
12a80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61   rc;.}../*.** Ca
12a90 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ll the destructo
12aa0 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61  r for each auxda
12ab0 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62  ta entry in pVdb
12ac0 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a  eFunc for which.
12ad0 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ** the correspon
12ae0 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b  ding bit in mask
12af0 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64   is clear.  Auxd
12b00 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f  ata entries beyo
12b10 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77  nd 31.** are alw
12b20 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20  ays destroyed.  
12b30 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61  To destroy all a
12b40 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20  uxdata entries, 
12b50 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  call this.** rou
12b60 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d  tine with mask==
12b70 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
12b80 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
12b90 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56  ata(VdbeFunc *pV
12ba0 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73  dbeFunc, int mas
12bb0 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  k){.  int i;.  f
12bc0 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46  or(i=0; i<pVdbeF
12bd0 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b  unc->nAux; i++){
12be0 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44  .    struct AuxD
12bf0 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64  ata *pAux = &pVd
12c00 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d  beFunc->apAux[i]
12c10 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20  ;.    if( (i>31 
12c20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32  || !(mask&(((u32
12c30 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75  )1)<<i))) && pAu
12c40 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
12c50 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
12c60 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
12c70 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
12c80 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
12c90 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
12ca0 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
12cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
12cc0 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
12cd0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
12ce0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
12cf0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12d00 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
12d10 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
12d20 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
12d30 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
12d40 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
12d50 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
12d60 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
12d70 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
12d80 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
12d90 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
12da0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
12db0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12dc0 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74  VdbeDeleteObject
12dd0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
12de0 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
12df0 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
12e00 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  xt;.  int i;.  a
12e10 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20  ssert( p->db==0 
12e20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  || p->db==db );.
12e30 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
12e40 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
12e50 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ar);.  releaseMe
12e60 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
12e70 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
12e80 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
12e90 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f  for(pSub=p->pPro
12ea0 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62  gram; pSub; pSub
12eb0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
12ec0 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74  xt = pSub->pNext
12ed0 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70  ;.    vdbeFreeOp
12ee0 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e  Array(db, pSub->
12ef0 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b  aOp, pSub->nOp);
12f00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
12f10 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20  ee(db, pSub);.  
12f20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56  }.  for(i=p->nzV
12f30 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ar-1; i>=0; i--)
12f40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12f50 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b  b, p->azVar[i]);
12f60 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
12f70 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
12f80 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
12f90 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
12fa0 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
12fb0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
12fc0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
12fd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12fe0 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >zSql);.  sqlite
12ff0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
13000 46 72 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e  Free);.#if defin
13010 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
13020 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20  _TREE_EXPLAIN). 
13030 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13040 62 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b  b, p->zExplain);
13050 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
13060 28 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e  (db, p->pExplain
13070 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
13080 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
13090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
130a0 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
130b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
130c0 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
130d0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
130e0 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
130f0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
13100 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
13110 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
13120 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
13130 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
13140 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
13150 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
13160 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
13170 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
13180 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
13190 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
131a0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
131b0 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
131c0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
131d0 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
131e0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56   = 0;.  sqlite3V
131f0 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28  dbeDeleteObject(
13200 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
13210 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
13220 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
13230 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
13240 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
13250 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
13260 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
13270 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
13280 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
13290 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
132a0 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
132b0 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
132c0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
132d0 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
132e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
132f0 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
13300 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
13310 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
13320 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
13330 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
13340 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
13350 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
13360 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
13370 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
13380 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
13390 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
133a0 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
133b0 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
133c0 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
133d0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
133e0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
133f0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
13400 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
13410 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
13420 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
13430 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
13440 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
13450 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13460 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13470 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
13480 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
13490 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
134a0 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
134b0 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
134c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
134d0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
134e0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
134f0 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
13500 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
13510 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
13520 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
13530 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
13540 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
13550 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
13560 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
13570 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13580 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  p->lastRowid = p
13590 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
135a0 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29      if( res!=0 )
135b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
135c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
135d0 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
135e0 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
135f0 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
13600 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
13610 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
13620 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
13630 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
13640 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
13650 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65  E_STALE;.  }else
13660 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70   if( ALWAYS(p->p
13670 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69  Cursor) ){.    i
13680 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20  nt hasMoved;.   
13690 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
136a0 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
136b0 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  oved(p->pCursor,
136c0 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20   &hasMoved);.   
136d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
136e0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73   rc;.    if( has
136f0 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70  Moved ){.      p
13700 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
13710 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
13720 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20     p->nullRow = 
13730 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
13740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
13760 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
13770 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
13780 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
13790 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
137a0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
137b0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
137c0 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
137d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
137e0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
137f0 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
13800 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
13810 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
13820 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
13830 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
13840 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
13850 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
13860 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
13870 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
13880 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
13890 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
138a0 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
138b0 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
138c0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
138d0 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
138e0 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
138f0 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
13900 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
13910 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
13920 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
13930 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
13940 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
13950 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
13960 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
13970 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
13980 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
13990 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
139a0 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
139b0 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
139c0 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
139d0 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
139e0 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
139f0 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
13a00 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
13a10 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
13a20 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72   data blob seper
13a30 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
13a40 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
13a50 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
13a60 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
13a70 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
13a80 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
13a90 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
13aa0 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
13ab0 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
13ac0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
13ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
13ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
13af0 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
13b10 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
13b20 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
13b40 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13b50 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13b60 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
13b70 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
13b80 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
13b90 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
13bc0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
13bd0 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
13be0 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
13bf0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
13c00 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
13c30 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13c40 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
13c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
13c60 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
13c70 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
13c80 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
13c90 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
13ca0 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
13cb0 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
13ce0 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
13cf0 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
13d10 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
13d20 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
13d30 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
13d60 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
13d70 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
13d80 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
13d90 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
13da0 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
13db0 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
13dc0 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
13dd0 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
13de0 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
13df0 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
13e00 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
13e10 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
13e20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
13e30 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
13e40 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
13e50 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
13e60 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
13e70 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
13e80 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
13e90 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
13ea0 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
13eb0 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
13ec0 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
13ed0 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
13ee0 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
13ef0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
13f00 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
13f10 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
13f20 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
13f30 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
13f40 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
13f50 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
13f60 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
13f70 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
13f80 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
13f90 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
13fa0 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
13fb0 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
13fc0 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74   if( file_format
13fd0 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20  >=4 && (i&1)==i 
13fe0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13ff0 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a  8+(u32)i;.    }.
14000 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
14010 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58       if( i<(-MAX
14020 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e  _6BYTE) ) return
14030 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65   6;.      /* Pre
14040 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65  vious test preve
14050 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32  nts:  u = -(-922
14060 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
14070 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d  ) */.      u = -
14080 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
14090 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
140a0 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
140b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
140c0 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
140d0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
140e0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
140f0 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
14100 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
14110 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
14120 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
14130 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
14140 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
14150 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
14160 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
14170 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
14180 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
14190 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
141a0 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
141b0 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65  ob) );.  n = pMe
141c0 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
141d0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
141e0 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
141f0 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73  .nZero;.  }.  as
14200 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
14210 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
14220 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
14230 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
14240 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14250 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
14260 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
14270 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
14280 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
14290 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
142a0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
142b0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
142c0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
142d0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
142e0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
142f0 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
14300 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
14310 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
14320 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
14330 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
14340 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
14350 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
14360 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
14370 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
14380 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
14390 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
143a0 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
143b0 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
143c0 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
143d0 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
143e0 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
143f0 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
14400 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
14410 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
14420 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
14430 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
14440 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
14450 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
14460 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
14470 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
14480 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
14490 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
144a0 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
144b0 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
144c0 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
144d0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
144e0 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
144f0 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
14500 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
14510 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
14520 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
14530 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
14540 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
14550 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
14560 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
14570 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
14580 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
14590 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
145a0 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
145b0 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
145c0 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
145d0 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
145e0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
145f0 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
14600 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
14610 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
14620 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
14630 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
14640 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
14650 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
14660 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
14670 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
14680 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
14690 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
146a0 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
146b0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
146c0 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
146d0 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
146e0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
146f0 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
14700 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
14710 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
14720 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
14730 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
14740 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
14750 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
14760 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
14770 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
14780 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
14790 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
147a0 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
147b0 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
147c0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
147d0 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
147e0 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
147f0 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
14800 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
14810 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
14820 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
14830 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
14840 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
14850 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
14860 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
14870 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
14880 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
14890 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
148a0 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
148b0 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
148c0 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
148d0 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
148e0 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
148f0 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
14900 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
14910 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
14920 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
14930 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
14940 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
14950 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
14960 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
14970 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
14980 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
14990 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
149a0 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
149b0 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
149c0 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
149d0 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
149e0 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
149f0 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
14a00 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
14a10 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
14a20 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
14a30 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
14a40 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
14a50 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
14a60 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
14a70 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
14a80 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
14a90 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
14aa0 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
14ab0 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
14ac0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
14ad0 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
14ae0 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
14af0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
14b00 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14b10 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
14b20 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
14b30 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
14b40 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
14b50 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
14b60 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
14b70 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
14b80 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
14b90 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
14ba0 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
14bb0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
14bc0 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
14bd0 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
14be0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
14bf0 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
14c00 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61  [].  nBuf must a
14c10 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67  lways be.** larg
14c20 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
14c30 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
14c40 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  d.  Except, if t
14c50 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61  he field is.** a
14c60 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72   blob with a zer
14c70 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74  o-filled tail, t
14c80 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20  hen buf[] might 
14c90 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68  be just the righ
14ca0 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c  t.** size to hol
14cb0 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63  d everything exc
14cc0 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  ept for the zero
14cd0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49  -filled tail.  I
14ce0 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e  f buf[].** is on
14cf0 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ly big enough to
14d00 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65   hold the non-ze
14d10 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20  ro prefix, then 
14d20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a  only write that.
14d30 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62  ** prefix into b
14d40 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75  uf[].  But if bu
14d50 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  f[] is large eno
14d60 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ugh to hold both
14d70 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61   the.** prefix a
14d80 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e  nd the tail then
14d90 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69   write the prefi
14da0 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61  x and set the ta
14db0 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72  il to all.** zer
14dc0 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  os..**.** Return
14dd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14de0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
14df0 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
14e00 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
14e10 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
14e20 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
14e30 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
14e40 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
14e50 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
14e60 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
14e70 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
14e80 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
14e90 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
14ea0 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d  buf, int nBuf, M
14eb0 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
14ec0 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
14ed0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
14ee0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14ef0 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
14f00 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20  _format);.  u32 
14f10 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
14f20 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
14f30 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14f40 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
14f50 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
14f60 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
14f70 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
14f80 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
14f90 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
14fa0 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
14fb0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
14fc0 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73  (&v, &pMem->r, s
14fd0 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
14fe0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
14ff0 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
15000 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
15010 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
15020 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
15030 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
15040 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
15050 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
15060 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20   len<=(u32)nBuf 
15070 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
15080 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
15090 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
150a0 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
150b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
150c0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
150d0 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
150e0 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
150f0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
15100 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20  assert( pMem->n 
15110 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  + ((pMem->flags 
15120 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d  & MEM_Zero)?pMem
15130 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20  ->u.nZero:0).   
15140 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e            == (in
15150 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t)sqlite3VdbeSer
15160 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
15170 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61  l_type) );.    a
15180 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d  ssert( pMem->n<=
15190 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20  nBuf );.    len 
151a0 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
151b0 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
151c0 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66  >z, len);.    if
151d0 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
151e0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
151f0 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75    len += pMem->u
15200 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73  .nZero;.      as
15210 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b  sert( nBuf>=0 );
15220 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e  .      if( len >
15230 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20   (u32)nBuf ){.  
15240 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32        len = (u32
15250 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20  )nBuf;.      }. 
15260 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66       memset(&buf
15270 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65  [pMem->n], 0, le
15280 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  n-pMem->n);.    
15290 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
152a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
152b0 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
152c0 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
152d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73   0;.}../*.** Des
152e0 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
152f0 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
15300 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
15310 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
15320 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
15330 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
15340 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
15350 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
15360 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73   read..*/ .u32 s
15370 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15380 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
15390 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
153a0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
153b0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
153c0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
153d0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
153e0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
153f0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
15400 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
15410 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
15420 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
15430 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
15440 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
15450 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
15460 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
15470 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
15480 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
15490 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
154a0 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
154b0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
154c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
154d0 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20    /* NULL */.   
154e0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
154f0 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
15500 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15510 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
15520 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
15530 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
15540 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65  em->u.i = (signe
15550 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20  d char)buf[0];. 
15560 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15570 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15580 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15590 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
155a0 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
155b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
155c0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
155d0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
155e0 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
155f0 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
15600 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
15610 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
15620 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
15630 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
15640 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
15650 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
15660 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
15670 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20  )buf[0])<<16) | 
15680 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75  (buf[1]<<8) | bu
15690 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[2];.      pMem
156a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
156b0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
156c0 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
156d0 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
156e0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
156f0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15700 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34  .i = (buf[0]<<24
15710 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
15720 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
15730 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70   buf[3];.      p
15740 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15750 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
15760 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
15770 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
15780 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
15790 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  er */.      u64 
157a0 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  x = (((signed ch
157b0 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
157c0 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75   buf[1];.      u
157d0 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c  32 y = (buf[2]<<
157e0 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31  24) | (buf[3]<<1
157f0 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29  6) | (buf[4]<<8)
15800 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20   | buf[5];.     
15810 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
15820 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
15830 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
15840 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15850 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15860 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
15870 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
15880 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
15890 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
158a0 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
158b0 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
158c0 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b   */.      u64 x;
158d0 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69  .      u32 y;.#i
158e0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
158f0 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
15900 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
15910 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
15920 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
15930 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
15940 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
15950 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
15960 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72        ** byte or
15970 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
15980 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
15990 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
159a0 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  T is.      ** de
159b0 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
159c0 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
159d0 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
159e0 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a  re mixed.      *
159f0 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20  * endian..      
15a00 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
15a10 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
15a20 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
15a30 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74  <<32;.      stat
15a40 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
15a50 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  r1 = 1.0;.      
15a60 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
15a70 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
15a80 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
15a90 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15aa0 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
15ab0 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
15ac0 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
15ad0 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  )==0 );.#endif..
15ae0 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30        x = (buf[0
15af0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
15b00 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
15b10 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
15b20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c      y = (buf[4]<
15b30 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c  <24) | (buf[5]<<
15b40 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38  16) | (buf[6]<<8
15b50 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20  ) | buf[7];.    
15b60 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
15b70 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  y;.      if( ser
15b80 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
15b90 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69         pMem->u.i
15ba0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
15bb0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15bc0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
15bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15be0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
15bf0 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
15c00 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a  (pMem->r)==8 );.
15c10 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65          swapMixe
15c20 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
15c30 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
15c40 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69  &pMem->r, &x, si
15c50 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20  zeof(x));.      
15c60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15c70 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
15c80 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  m->r) ? MEM_Null
15c90 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20   : MEM_Real;.   
15ca0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
15cb0 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 8;.    }.    c
15cc0 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
15cd0 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
15ce0 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
15cf0 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70  ger 1 */.      p
15d00 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
15d10 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
15d20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15d30 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
15d40 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
15d50 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
15d60 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72    u32 len = (ser
15d70 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
15d80 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
15d90 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
15da0 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
15db0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
15dc0 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
15dd0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
15de0 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
15df0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15e00 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
15e10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15e20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15e30 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
15e40 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
15e50 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
15e60 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
15e70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15e80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15e90 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
15ea0 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
15eb0 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
15ec0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
15ed0 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
15ee0 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
15ef0 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
15f00 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
15f10 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
15f20 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
15f30 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
15f40 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
15f50 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
15f60 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
15f70 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
15f80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15f90 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
15fa0 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
15fb0 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
15fc0 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
15fd0 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
15fe0 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
15ff0 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
16000 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
16010 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
16020 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
16030 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
16040 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
16050 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
16060 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
16070 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
16080 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
16090 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
160a0 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
160b0 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
160c0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
160d0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
160e0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
160f0 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
16100 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
16110 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
16120 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
16130 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
16140 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
16150 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
16160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
16170 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
16180 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
16190 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
161a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
161b0 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
161c0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  vailable */.  in
161d0 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20  t szSpace,      
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161f0 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
16200 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
16210 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20  char **ppFree   
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73  /* OUT: Caller s
16240 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20  hould free this 
16250 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  pointer */.){.  
16260 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
16270 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
16280 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
16290 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
162a0 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20    int nOff;     
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70    /* Increment p
162d0 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f  Space by nOff to
162e0 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69   align it */.  i
162f0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16310 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16320 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a  s required for *
16330 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61  p */..  /* We wa
16340 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20  nt to shift the 
16350 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75  pointer pSpace u
16360 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  p such that it i
16370 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 8-byte aligned
16380 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20  ..  ** Thus, we 
16390 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  need to calculat
163a0 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c  e a value, nOff,
163b0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37   between 0 and 7
163c0 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a  , to shift .  **
163d0 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61   it by.  If pSpa
163e0 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d  ce is already 8-
163f0 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f  byte aligned, nO
16400 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  ff should be zer
16410 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d  o..  */.  nOff =
16420 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54   (8 - (SQLITE_PT
16430 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29  R_TO_INT(pSpace)
16440 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42   & 7)) & 7;.  nB
16450 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
16460 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
16470 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
16480 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
16490 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
164a0 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66  Byte>szSpace+nOf
164b0 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  f ){.    p = (Un
164c0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
164d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
164e0 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
164f0 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46  nByte);.    *ppF
16500 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b  ree = (char *)p;
16510 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65  .    if( !p ) re
16520 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
16530 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
16540 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63  edRecord*)&pSpac
16550 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70  e[nOff];.    *pp
16560 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Free = 0;.  }.. 
16570 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
16580 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
16590 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
165a0 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
165b0 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
165c0 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
165d0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
165e0 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
165f0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
16600 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
16610 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
16620 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
16630 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
16640 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
16650 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
16660 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
16670 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
16680 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
16690 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
166a0 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
166b0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
166c0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
166d0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
166e0 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
166f0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
16700 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
16710 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
16720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16730 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
16740 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
16750 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
16760 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
16770 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
16780 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
16790 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
167a0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
167b0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
167c0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
167d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
167e0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
167f0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
16800 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
16810 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16830 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
16840 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
16850 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
16880 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
16890 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
168a0 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
168b0 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20  em;..  p->flags 
168c0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
168d0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
168e0 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
168f0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
16900 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
16910 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
16920 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
16930 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
16940 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
16950 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
16960 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
16970 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
16980 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
16990 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
169a0 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
169b0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
169c0 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
169d0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
169e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
169f0 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
16a00 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
16a10 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
16a20 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  /.    pMem->zMal
16a30 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  loc = 0;.    pMe
16a40 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20  m->z = 0;.    d 
16a50 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
16a60 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
16a70 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
16a80 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
16a90 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20  ;.    u++;.  }. 
16aa0 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
16ab0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
16ac0 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
16ad0 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = u;.}../*.** Th
16ae0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
16af0 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
16b00 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
16b10 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
16b20 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
16b30 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
16b40 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
16b50 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
16b60 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
16b70 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
16b80 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
16b90 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
16ba0 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
16bb0 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
16bc0 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
16bd0 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
16be0 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65  ed by th OP_Make
16bf0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
16c00 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
16c10 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
16c20 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
16c30 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
16c40 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
16c50 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
16c60 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  rd..**.** Key1 a
16c70 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
16c80 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
16c90 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16ca0 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65  f fields..** The
16cb0 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20   key with fewer 
16cc0 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c  fields is usuall
16cd0 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20  y compares less 
16ce0 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e  than the .** lon
16cf0 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65  ger key.  Howeve
16d00 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
16d10 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20  D_INCRKEY flags 
16d20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74  in pPKey2 is set
16d30 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d  .** and the comm
16d40 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20  on prefixes are 
16d50 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31  equal, then key1
16d60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65   is less than ke
16d70 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65  y2..** Or if the
16d80 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f   UNPACKED_MATCH_
16d90 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73  PREFIX flag is s
16da0 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69  et and the prefi
16db0 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  xes are.** equal
16dc0 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20  , then the keys 
16dd0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
16de0 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a  o be equal and.*
16df0 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f  * the parts beyo
16e00 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
16e10 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64  efix are ignored
16e20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16e30 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
16e40 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
16e50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
16e60 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
16e70 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
16e80 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
16e90 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
16ea0 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20  /.){.  int d1;  
16eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
16ec0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
16ed0 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
16ee0 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
16ef0 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
16f00 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
16f10 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
16f20 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
16f30 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
16f40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
16f50 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
16f60 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
16f70 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69   int nField;.  i
16f80 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
16f90 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16fa0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
16fb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16fc0 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
16fd0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
16fe0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
16ff0 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
17000 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e  KeyInfo;.  mem1.
17010 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
17020 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
17030 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
17040 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
17050 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
17060 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
17070 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17080 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
17090 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  NLY( mem1.zMallo
170a0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
170b0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
170c0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
170d0 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
170e0 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
170f0 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
17100 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
17110 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
17120 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
17130 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
17140 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
17150 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
17160 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
17170 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
17180 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
17190 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
171a0 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
171b0 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
171c0 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
171d0 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
171e0 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
171f0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
17200 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
17210 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
17220 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
17230 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
17240 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
17250 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
17260 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
17270 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
17280 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
17290 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
172a0 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
172b0 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
172c0 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
172d0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
172e0 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
172f0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
17300 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
17310 20 73 7a 48 64 72 31 3b 0a 20 20 6e 46 69 65 6c   szHdr1;.  nFiel
17320 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
17330 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69  ield;.  while( i
17340 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
17350 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
17360 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
17370 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
17380 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
17390 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
173a0 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
173b0 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
173c0 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
173d0 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
173e0 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
173f0 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79      if( d1>=nKey
17400 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  1 && sqlite3Vdbe
17410 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
17420 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20  rial_type1)>0 ) 
17430 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45  break;..    /* E
17440 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
17450 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
17460 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
17470 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
17480 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
17490 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
174a0 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
174b0 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
174c0 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
174d0 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
174e0 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
174f0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20  Key2->aMem[i],. 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17510 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65            i<nFie
17520 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ld ? pKeyInfo->a
17530 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
17540 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
17550 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
17560 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  1.zMalloc==0 ); 
17570 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
17580 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20  below */..      
17590 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65  /* Invert the re
175a0 73 75 6c 74 20 69 66 20 77 65 20 61 72 65 20 75  sult if we are u
175b0 73 69 6e 67 20 44 45 53 43 20 73 6f 72 74 20 6f  sing DESC sort o
175c0 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rder. */.      i
175d0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
175e0 72 74 4f 72 64 65 72 20 26 26 20 69 3c 6e 46 69  rtOrder && i<nFi
175f0 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  eld && pKeyInfo-
17600 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
17610 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
17620 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17630 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
17640 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
17650 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61  lag is set and a
17660 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70 74  ll fields except
17670 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20 20   the final.     
17680 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20   ** rowid field 
17690 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e  were equal, then
176a0 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49   clear the PREFI
176b0 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e  X_SEARCH flag an
176c0 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20  d set .      ** 
176d0 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f  pPKey2->rowid to
176e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
176f0 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e  e rowid field in
17700 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e   (pKey1, nKey1).
17710 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
17720 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50  s used by the OP
17730 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65  _IsUnique opcode
17740 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17750 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c   if( (pPKey2->fl
17760 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
17770 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26  REFIX_SEARCH) &&
17780 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69   i==(pPKey2->nFi
17790 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  eld-1) ){.      
177a0 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d    assert( idx1==
177b0 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a  szHdr1 && rc );.
177c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
177d0 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d  mem1.flags & MEM
177e0 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  _Int );.        
177f0 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d  pPKey2->flags &=
17800 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49   ~UNPACKED_PREFI
17810 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20  X_SEARCH;.      
17820 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20    pPKey2->rowid 
17830 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20  = mem1.u.i;.    
17840 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 72    }.    .      r
17850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17860 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
17870 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
17880 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
17890 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
178a0 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
178b0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
178c0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
178d0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
178e0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
178f0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
17900 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
17910 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
17920 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
17930 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  em1)..  */.  ass
17940 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
17950 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
17960 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
17970 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
17980 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
17990 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
179a0 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
179b0 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
179c0 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
179d0 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  e UNPACKED_INCRK
179e0 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  EY.  ** flag is 
179f0 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20  set, then break 
17a00 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74  the tie by treat
17a10 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67  ing key2 as larg
17a20 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  er..  ** If the 
17a30 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  UPACKED_PREFIX_M
17a40 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ATCH flag is set
17a50 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68  , then keys with
17a60 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
17a70 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64  .  ** are consid
17a80 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
17a90 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
17aa0 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20  e longer key is 
17ab0 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72  the .  ** larger
17ac0 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73  .  As it happens
17ad0 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c  , the pPKey2 wil
17ae0 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  l always be the 
17af0 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20 74  longer.  ** if t
17b00 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72  here is a differ
17b10 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ence..  */.  ass
17b20 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
17b30 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
17b40 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  s & UNPACKED_INC
17b50 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20 3d  RKEY ){.    rc =
17b60 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   -1;.  }else if(
17b70 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
17b80 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58   UNPACKED_PREFIX
17b90 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a  _MATCH ){.    /*
17ba0 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a   Leave rc==0 */.
17bb0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31    }else if( idx1
17bc0 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 72  <szHdr1 ){.    r
17bd0 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 1;.  }.  ret
17be0 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a  urn rc;.}. ../*.
17bf0 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
17c00 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
17c10 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
17c20 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
17c30 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
17c40 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
17c50 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
17c60 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
17c70 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
17c80 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
17c90 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
17ca0 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
17cb0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
17cc0 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
17cd0 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
17ce0 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
17cf0 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
17d00 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
17d10 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
17d20 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
17d30 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
17d40 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
17d50 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
17d60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
17d70 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
17d80 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
17d90 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
17da0 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
17db0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
17dc0 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
17dd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17de0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
17df0 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
17e00 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
17e10 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
17e20 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
17e30 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
17e40 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
17e50 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55  Mem m, v;..  UNU
17e60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
17e70 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  );..  /* Get the
17e80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
17e90 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
17ea0 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
17eb0 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
17ec0 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
17ed0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
17ee0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
17ef0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
17f00 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
17f10 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
17f20 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
17f30 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
17f40 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
17f50 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
17f60 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
17f70 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
17f80 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
17f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
17fa0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
17fb0 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
17fc0 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
17fd0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
17fe0 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
17ff0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
18000 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f  LITE_OK );     /
18010 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
18020 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
18030 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
18040 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
18050 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
18060 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
18070 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
18080 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
18090 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
180a0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
180b0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30  /.  memset(&m, 0
180c0 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20  , sizeof(m));.  
180d0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
180e0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
180f0 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c  r, 0, (int)nCell
18100 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
18110 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
18120 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
18130 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72  * The index entr
18140 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74  y must begin wit
18150 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20  h a header size 
18160 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
18170 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c  rint32((u8*)m.z,
18180 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63   szHdr);.  testc
18190 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b  ase( szHdr==3 );
181a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
181b0 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28  dr==m.n );.  if(
181c0 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c   unlikely(szHdr<
181d0 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e  3 || (int)szHdr>
181e0 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  m.n) ){.    goto
181f0 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
18200 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
18210 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20   The last field 
18220 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f  of the index sho
18230 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65  uld be an intege
18240 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20  r - the ROWID.. 
18250 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   ** Verify that 
18260 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72  the last entry r
18270 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65  eally is an inte
18280 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29  ger. */.  (void)
18290 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
182a0 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20  )&m.z[szHdr-1], 
182b0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
182c0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
182d0 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  d==1 );.  testca
182e0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32  se( typeRowid==2
182f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18300 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a  typeRowid==3 );.
18310 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18320 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65  Rowid==4 );.  te
18330 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18340 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61  d==5 );.  testca
18350 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36  se( typeRowid==6
18360 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18370 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a  typeRowid==8 );.
18380 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18390 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66  Rowid==9 );.  if
183a0 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52  ( unlikely(typeR
183b0 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f  owid<1 || typeRo
183c0 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77  wid>9 || typeRow
183d0 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f  id==7) ){.    go
183e0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
183f0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c  ruption;.  }.  l
18400 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
18410 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
18420 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  en(typeRowid);. 
18430 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29   testcase( (u32)
18440 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f  m.n==szHdr+lenRo
18450 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  wid );.  if( unl
18460 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73  ikely((u32)m.n<s
18470 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29  zHdr+lenRowid) )
18480 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
18490 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
184a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68  .  }..  /* Fetch
184b0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66   the integer off
184c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
184d0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
184e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
184f0 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a  ialGet((u8*)&m.z
18500 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
18510 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
18520 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69    *rowid = v.u.i
18530 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
18540 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
18550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18560 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
18570 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63  re if database c
18580 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
18590 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61  ected after m ha
185a0 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f  s been.  ** allo
185b0 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65  cated.  Free the
185c0 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65   m object and re
185d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
185e0 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69  UPT. */.idx_rowi
185f0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20  d_corruption:.  
18600 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c  testcase( m.zMal
18610 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
18620 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
18630 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
18640 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18650 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
18660 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
18670 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
18680 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
18690 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
186a0 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
186b0 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
186c0 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
186d0 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
186e0 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
186f0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
18700 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
18710 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
18720 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
18730 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
18740 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
18750 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18760 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
18770 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
18780 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
18790 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
187a0 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
187b0 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
187c0 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
187d0 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
187e0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
187f0 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
18800 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
18810 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
18820 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
18830 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
18840 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
18850 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
18860 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
18870 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
18880 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
18890 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
188a0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20  VdbeCursor *pC, 
188b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
188c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
188d0 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
188e0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
188f0 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a   *pUnpacked,  /*
18900 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
18910 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70  n of key to comp
18920 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
18930 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18950 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
18960 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
18970 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
18980 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
18990 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
189a0 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
189b0 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  sor;.  Mem m;.. 
189c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
189d0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
189e0 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
189f0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
18a00 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
18a10 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
18a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
18a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
18a40 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
18a50 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
18a60 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
18a70 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79  */.  /* nCellKey
18a80 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
18a90 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78  between 0 and 0x
18aa0 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65  ffffffff because
18ab0 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a   of the say.  **
18ac0 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65   that btreeParse
18ad0 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71  CellPtr() and sq
18ae0 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
18af0 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
18b00 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c  ed */.  if( nCel
18b10 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c  lKey<=0 || nCell
18b20 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29  Key>0x7fffffff )
18b30 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
18b40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18b50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18b60 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c    }.  memset(&m,
18b70 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
18b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
18b90 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
18ba0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
18bb0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  int)nCellKey, 1,
18bc0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
18bd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
18be0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18bf0 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20  Unpacked->flags 
18c00 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
18c10 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20 2a 72 65  X_MATCH );.  *re
18c20 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
18c30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
18c40 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
18c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18c60 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
18c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18c80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
18c90 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
18ca0 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
18cb0 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
18cc0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
18cd0 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
18ce0 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
18cf0 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
18d00 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
18d10 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
18d20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
18d30 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
18d40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18d50 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
18d60 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
18d70 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
18d80 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
18d90 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
18da0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
18db0 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
18dc0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
18dd0 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
18de0 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
18df0 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
18e00 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18e10 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
18e20 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
18e30 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
18e40 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
18e50 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18e60 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
18e70 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
18e80 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
18e90 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
18ea0 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
18eb0 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
18ec0 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
18ed0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
18ee0 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
18ef0 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
18f00 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
18f10 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
18f20 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
18f30 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
18f40 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
18f50 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
18f60 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
18f70 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
18f80 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
18f90 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
18fa0 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
18fb0 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
18fc0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
18fd0 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
18fe0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
18ff0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
19000 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
19010 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
19020 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
19030 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
19040 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
19050 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
19060 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19070 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
19080 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
19090 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
190a0 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
190b0 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
190c0 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
190d0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
190e0 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
190f0 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
19100 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
19110 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
19120 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
19130 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
19140 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
19150 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
19160 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
19170 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
19180 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
19190 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
191a0 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
191b0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
191c0 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
191d0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
191e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
191f0 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
19200 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
19210 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
19220 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
19230 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
19240 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
19250 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
19260 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
19270 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
19280 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
19290 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
192a0 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
192b0 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
192c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
192d0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
192e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
192f0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
19300 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
19310 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
19320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19330 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
19340 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
19350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
19360 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
19370 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
19380 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
19390 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
193a0 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a  StoreType((Mem *
193b0 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  )pRet);.      }.
193c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
193d0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
193e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
193f0 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
19400 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
19410 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
19420 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
19430 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
19440 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
19450 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
19460 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
19470 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
19480 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
19490 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
194a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
194b0 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
194c0 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
194d0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
194e0 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
194f0 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
19500 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
19510 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
19520 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
19530 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
19540 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  }.}..#ifdef SQLI
19550 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
19560 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20  ATE_HOOK../*.** 
19570 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
19580 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
19590 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20  LL, release any 
195a0 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
195b0 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
195c0 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  the memory cells
195d0 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b   in the p->aMem[
195e0 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72  ] array. Also fr
195f0 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52  ee the UnpackedR
19600 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
19610 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67  re itself, using
19620 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
19630 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
19640 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
19650 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65   free UnpackedRe
19660 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20  cord structures 
19670 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
19680 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65  the vdbeUnpackRe
19690 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  cord() function 
196a0 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69  found in vdbeapi
196b0 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .c..*/.static vo
196c0 69 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  id vdbeFreeUnpac
196d0 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ked(sqlite3 *db,
196e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
196f0 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
19700 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
19710 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46 69  or(i=0; i<p->nFi
19720 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
19730 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
19740 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  >aMem[i];.      
19750 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  if( pMem->zMallo
19760 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
19770 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
19780 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19790 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
197a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
197b0 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
197c0 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69  ate hook. If thi
197d0 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
197e0 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64  r DELETE pre-upd
197f0 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65  ate call,.** the
19800 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  n cursor passed 
19810 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
19820 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f  gument should po
19830 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61  int to the row a
19840 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70  bout.** to be up
19850 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e  date or deleted.
19860 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
19870 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
19880 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
19890 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72  ),.** the requir
198a0 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ed value will be
198b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
198c0 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ow the cursor po
198d0 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64  ints to..*/.void
198e0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
198f0 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62  pdateHook(.  Vdb
19900 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19920 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20  Vdbe pre-update 
19930 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
19940 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  by */.  VdbeCurs
19950 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
19960 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
19970 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20  r to grab old.* 
19980 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20  values from */. 
19990 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199b0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52   /* SQLITE_INSER
199c0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
199d0 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ETE */.  const c
199e0 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
199f0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
19a00 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54  base name */.  T
19a10 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19a30 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  * Modified table
19a40 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c   */.  i64 iKey1,
19a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a60 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
19a70 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20   key value */.  
19a80 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
19ab0 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a  new.* record */.
19ac0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19ad0 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20   = v->db;.  i64 
19ae0 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61  iKey2;.  PreUpda
19af0 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20  te preupdate;.  
19b00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
19b10 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
19b20 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
19b30 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
19b40 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
19b50 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
19b60 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
19b70 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  ( op==SQLITE_UPD
19b80 41 54 45 20 29 7b 0a 20 20 20 20 69 4b 65 79 32  ATE ){.    iKey2
19b90 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d   = v->aMem[iReg]
19ba0 2e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  .u.i;.  }else{. 
19bb0 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31     iKey2 = iKey1
19bc0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
19bd0 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70   pCsr->nField==p
19be0 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20  Tab->nCol .     
19bf0 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65    || (pCsr->nFie
19c00 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  ld==pTab->nCol+1
19c10 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   && op==SQLITE_D
19c20 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d  ELETE && iReg==-
19c30 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70  1).  );..  preup
19c40 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72  date.v = v;.  pr
19c50 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70  eupdate.pCsr = p
19c60 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Csr;.  preupdate
19c70 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75  .op = op;.  preu
19c80 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20  pdate.iNewReg = 
19c90 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74  iReg;.  preupdat
19ca0 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64  e.keyinfo.db = d
19cb0 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  b;.  preupdate.k
19cc0 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43  eyinfo.enc = ENC
19cd0 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74  (db);.  preupdat
19ce0 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64  e.keyinfo.nField
19cf0 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
19d00 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31   preupdate.iKey1
19d10 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75   = iKey1;.  preu
19d20 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b  pdate.iKey2 = iK
19d30 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey2;.  preupdate
19d40 2e 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69  .iPKey = pTab->i
19d50 50 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72  PKey;..  db->pPr
19d60 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70  eUpdate = &preup
19d70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65  date;.  db->xPre
19d80 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
19d90 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
19da0 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a  , db, op, zDb, z
19db0 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79  Tbl, iKey1, iKey
19dc0 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  2);.  db->pPreUp
19dd0 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  date = 0;.  sqli
19de0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72  te3DbFree(db, pr
19df0 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29  eupdate.aRecord)
19e00 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
19e10 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
19e20 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
19e30 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
19e40 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
19e50 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20  pNewUnpacked);. 
19e60 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61   if( preupdate.a
19e70 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  New ){.    int i
19e80 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19e90 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69  <pCsr->nField; i
19ea0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
19eb0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
19ec0 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  (&preupdate.aNew
19ed0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
19ee0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19ef0 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  , preupdate.aNew
19f00 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
19f10 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
19f20 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
19f30 2a 2f 0a                                         */.