/ Hex Artifact Content
Login

Artifact 61701754a1528451ddb6e55e9d353e35ea940492:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
07d0: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
07e0: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
07f0: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0800: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0810: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0820: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0830: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0840: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0850: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0860: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0870: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0880: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0890: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
08a0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08b0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08c0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
08d0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
08e0: 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65  pareV2;.}..#ifde
08f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0900: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0910: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0920: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0930: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0940: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0950: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
0960: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0970: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
0980: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
0990: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74  t it is at least
09a0: 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74   one op larger t
09b0: 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a  han .** it was..
09c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d  **.** If an out-
09d0: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
09e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73  occurs while res
09f0: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c  izing the array,
0a00: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
0a10: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
0a20: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61   case Vdbe.aOp a
0a30: 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63  nd Vdbe.nOpAlloc
0a40: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68   remain .** unch
0a50: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73  anged (this is s
0a60: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64  o that any opcod
0a70: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
0a80: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20  ated can be .** 
0a90: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0aa0: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
0ab0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
0ac0: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   Vdbe)..*/.stati
0ad0: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61  c int growOpArra
0ae0: 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64  y(Vdbe *p){.  Vd
0af0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0b00: 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70  t nNew = (p->nOp
0b10: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
0b20: 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30  loc*2 : (int)(10
0b30: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b  24/sizeof(Op)));
0b40: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0b50: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
0b60: 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  , p->aOp, nNew*s
0b70: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66  izeof(Op));.  if
0b80: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d  ( pNew ){.    p-
0b90: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  >nOpAlloc = sqli
0ba0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0bb0: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a  p->db, pNew)/siz
0bc0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e  eof(Op);.    p->
0bd0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0be0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0bf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0c00: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f  ITE_NOMEM);.}../
0c10: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0c20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0c30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0c40: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0c50: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0c60: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0c70: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0c80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0c90: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0ca0: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0cb0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0cc0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0cd0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0ce0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0cf0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0d00: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0d10: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
0d20: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
0d30: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
0d40: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
0d50: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
0d60: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
0d70: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
0d80: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
0d90: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
0da0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
0db0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
0dc0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0dd0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
0de0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0df0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
0e00: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
0e10: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
0e20: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
0e30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
0e40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
0e50: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
0e60: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
0e70: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0e80: 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70  {.    if( growOp
0e90: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
0ea0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0eb0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0ec0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0ed0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0ee0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
0ef0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
0f00: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
0f10: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
0f20: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
0f30: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
0f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
0f50: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
0f60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
0f70: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
0f80: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
0f90: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
0fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
0fb0: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
0fc0: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69  p[i]);.#endif.#i
0fd0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
0fe0: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
0ff0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1000: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  = 0;.#endif.  re
1010: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71  turn i;.}.int sq
1020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1030: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29  Vdbe *p, int op)
1040: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1050: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1060: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  op, 0, 0, 0);.}.
1070: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1080: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69  ddOp1(Vdbe *p, i
1090: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a  nt op, int p1){.
10a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10b0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
10c0: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  , p1, 0, 0);.}.i
10d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
10e0: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp2(Vdbe *p, in
10f0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1100: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p2){.  return 
1110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1120: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1130: 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   0);.}.../*.** A
1140: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
1150: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
1160: 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69  4 value as a poi
1170: 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
1180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
1190: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
11a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
11b0: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
11c0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11e0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
11f0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
1200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
1210: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1220: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
1230: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
1240: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1260: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
1270: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1280: 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50  zP4,    /* The P
1290: 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  4 operand */.  i
12a0: 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20  nt p4type       
12b0: 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64     /* P4 operand
12c0: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   type */.){.  in
12d0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
12e0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12f0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1300: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1310: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP4(p, addr, zP
1320: 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65  4, p4type);.  re
1330: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1340: 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61  .** Add an OP_Pa
1350: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65  rseSchema opcode
1360: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1370: 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  is broken out fr
1380: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1390: 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20  eAddOp4() since 
13a0: 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f  it needs to also
13b0: 20 6c 6f 63 61 6c 20 61 6c 6c 20 62 74 72 65 65   local all btree
13c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68  s..**.** The zWh
13d0: 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ere string must 
13e0: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
13f0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1400: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69  malloc()..** Thi
1410: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74  s routine will t
1420: 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ake ownership of
1430: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
1440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  emory..*/.void s
1450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1460: 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20  seSchemaOp(Vdbe 
1470: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61  *p, int iDb, cha
1480: 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *zWhere){.  in
1490: 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20  t j;.  int addr 
14a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14b0: 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(p, OP_ParseS
14c0: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
14d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14e0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
14f0: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
1500: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
1510: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
1520: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
1530: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
1540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1550: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1560: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1570: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1580: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1590: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
15a0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
15b0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
15c0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
15d0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15f0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1600: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1610: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1620: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1630: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1640: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1650: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1670: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1680: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
16a0: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
16b0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
16c0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
16d0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
16e0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
16f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1700: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1710: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1720: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1730: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1750: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1760: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1770: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1780: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1790: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
17a0: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
17b0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
17c0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
17d0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
17e0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
17f0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
1800: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1810: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1820: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1830: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1840: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1850: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1860: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1870: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1880: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1890: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
18a0: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
18b0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
18c0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
18d0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
18e0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
18f0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
1900: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1910: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1920: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1930: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1940: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1950: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1960: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1970: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1980: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1990: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
19a0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
19b0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
19c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19d0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
19e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
19f0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
1a00: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1a10: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1a20: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1a30: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1a40: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61    int n = p->nLa
1a50: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  belAlloc*2 + 5;.
1a60: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1a70: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1a80: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1a90: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  n*sizeof(p->aLab
1ad0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e  el[0]));.    p->
1ae0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71  nLabelAlloc = sq
1af0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
1b00: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1b10: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  el)/sizeof(p->aL
1b20: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  abel[0]);.  }.  
1b30: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1b40: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1b50: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1b60: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1b70: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1b80: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1b90: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1ba0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1bb0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
1bc0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
1bd0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
1be0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
1bf0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
1c00: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1c10: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1c20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1c30: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1c40: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1c50: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1c60: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1c70: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1c80: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1c90: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1ca0: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1cb0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1cc0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1cd0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1ce0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1cf0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1d00: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1d10: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1d20: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1d30: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1d40: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1d50: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1d60: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1d70: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1d80: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1d90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1da0: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1db0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1dc0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1dd0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1de0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1df0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1e00: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1e10: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1e20: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1e30: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1e40: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1e50: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1e60: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1e70: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1e80: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1e90: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1ea0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1eb0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1ec0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1ef0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1f00: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1f10: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1f20: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1f30: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1f40: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1f50: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1f60: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1f70: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1f80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1f90: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1fa0: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1fb0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1fc0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1fd0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1fe0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1ff0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
2000: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
2010: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
2020: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
2030: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
2040: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
2050: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2060: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
2070: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
2080: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
2090: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
20a0: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
20b0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
20c0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20e0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
20f0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
2100: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
2110: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
2120: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
2130: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
2140: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
2150: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
2160: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
2170: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
2180: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
2190: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
21a0: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
21b0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
21c0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
21d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
21e0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
21f0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
2200: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
2210: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2220: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2230: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2240: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2250: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2260: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2270: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2280: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2290: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
22a0: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
22b0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
22c0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
22d0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
22e0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
22f0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
2300: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
2310: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2320: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2330: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2340: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2350: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2360: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2370: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2380: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2390: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
23a0: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
23b0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
23c0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
23d0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
23e0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
23f0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
2400: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2410: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2420: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2430: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2440: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2460: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2480: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2490: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
24a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
24b0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
24c0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
24d0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
24e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
24f0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
2500: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2510: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2520: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2530: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2540: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2550: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2560: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2570: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2580: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2590: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
25a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
25b0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
25c0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
25d0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
25e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
25f0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
2600: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2610: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2620: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2630: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2640: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2650: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2660: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2670: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2680: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2690: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
26a0: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
26b0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
26c0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
26d0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
26e0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
26f0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
2700: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2710: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2730: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2740: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2750: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2760: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2770: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2780: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2790: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
27a0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
27b0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
27c0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
27d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
27e0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
27f0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
2800: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2810: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2820: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2830: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2840: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2850: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2860: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2870: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2880: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2890: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
28a0: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
28b0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
28c0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
28d0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
28e0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
28f0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
2900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2910: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2920: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2930: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2940: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2950: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2960: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2970: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2980: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2990: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
29a0: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
29b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
29c0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
29d0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
29e0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
29f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a00: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2a10: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2a20: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
2a30: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2a40: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2a50: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
2a60: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2a70: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2a80: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2a90: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2aa0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
2ab0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
2ac0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
2ad0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
2ae0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
2af0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
2b00: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2b10: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2b20: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
2b30: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
2b40: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
2b50: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
2b60: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
2b70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2b80: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2b90: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2ba0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
2bb0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
2bc0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
2bd0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
2be0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
2bf0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
2c00: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2c10: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2c20: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
2c30: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
2c40: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
2c50: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
2c60: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
2c70: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
2c80: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2c90: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2ca0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2cb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2cc0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2cd0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2ce0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2cf0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2d00: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2d10: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2d20: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
2d30: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
2d40: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
2d50: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
2d60: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
2d70: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
2d80: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2d90: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2da0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2db0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
2dc0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
2dd0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
2de0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
2df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2e00: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
2e10: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
2e20: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
2e30: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
2e40: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
2e50: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
2e60: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
2e70: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
2e80: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f  adOnly = 1;.  fo
2e90: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2ea0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2eb0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2ec0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2ed0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70  ->opcode;..    p
2ee0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71  Op->opflags = sq
2ef0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
2f00: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20  rty[opcode];.   
2f10: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2f20: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
2f30: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
2f40: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2f50: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
2f60: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
2f70: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
2f80: 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61   (opcode==OP_Tra
2f90: 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d  nsaction && pOp-
2fa0: 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64  >p2!=0) || opcod
2fb0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a  e==OP_Vacuum ){.
2fc0: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c        p->readOnl
2fd0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
2fe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2ff0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
3000: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
3010: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20  _VUpdate ){.    
3020: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
3030: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
3040: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
3050: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
3060: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
3070: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
3080: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
3090: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
30a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
30b0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
30c0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
30d0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
30e0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
30f0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
3100: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
3110: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
3120: 65 3d 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 6f 70  e==OP_Next || op
3130: 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e  code==OP_SorterN
3140: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  ext ){.      pOp
3150: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
3160: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
3170: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  ;.      pOp->p4t
3180: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45  ype = P4_ADVANCE
3190: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
31a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 72 65 76 20  opcode==OP_Prev 
31b0: 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  ){.      pOp->p4
31c0: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
31d0: 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
31e0: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  ;.      pOp->p4t
31f0: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45  ype = P4_ADVANCE
3200: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
3210: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
3220: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
3230: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
3240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
3250: 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62  -pOp->p2<p->nLab
3260: 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  el );.      pOp-
3270: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
3280: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a  pOp->p2];.    }.
3290: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
32a0: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
32b0: 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62  abel);.  p->aLab
32c0: 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78  el = 0;..  *pMax
32d0: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
32e0: 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rgs;.}../*.** Re
32f0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
3300: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3310: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
3320: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
3330: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3340: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
3350: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3360: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3370: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
3380: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
3390: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33a0: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
33b0: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
33c0: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
33d0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
33e0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
33f0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3400: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
3410: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
3420: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
3430: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
3440: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
3450: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
3460: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
3470: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
3480: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3490: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
34a0: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
34b0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
34c0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
34d0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
34e0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
34f0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
3500: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
3510: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
3520: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
3530: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3540: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
3550: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
3560: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
3570: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
3580: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
3590: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
35a0: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
35b0: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
35c0: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
35d0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
35e0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
35f0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
3600: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
3610: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
3620: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
3630: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
3640: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
3650: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65   assert( p->btre
3660: 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72  eMask==0 );..  r
3670: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
3680: 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a  , pnMaxArg);.  *
3690: 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  pnOp = p->nOp;. 
36a0: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72   p->aOp = 0;.  r
36b0: 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a  eturn aOp;.}../*
36c0: 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20  .** Add a whole 
36d0: 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f  list of operatio
36e0: 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ns to the operat
36f0: 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75  ion stack.  Retu
3700: 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73  rn the.** addres
3710: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  s of the first o
3720: 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a  peration added..
3730: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3740: 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65  beAddOpList(Vdbe
3750: 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64   *p, int nOp, Vd
3760: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
3770: 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  aOp){.  int addr
3780: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
3790: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
37a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
37b0: 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d  ->nOp + nOp > p-
37c0: 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f  >nOpAlloc && gro
37d0: 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20  wOpArray(p) ){. 
37e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
37f0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
3800: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e  ;.  if( ALWAYS(n
3810: 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  Op>0) ){.    int
3820: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
3830: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
3840: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
3850: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
3860: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
3870: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
3880: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
3890: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
38a0: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
38b0: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
38c0: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
38d0: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
38e0: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26        if( p2<0 &
38f0: 26 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  & (sqlite3Opcode
3900: 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f  Property[pOut->o
3910: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a  pcode] & OPFLG_J
3920: 55 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  UMP)!=0 ){.     
3930: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64     pOut->p2 = ad
3940: 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20  dr + ADDR(p2);. 
3950: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3960: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70      pOut->p2 = p
3970: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
3980: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d   pOut->p3 = pIn-
3990: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  >p3;.      pOut-
39a0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
39b0: 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74  USED;.      pOut
39c0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20  ->p4.p = 0;.    
39d0: 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a    pOut->p5 = 0;.
39e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
39f0: 42 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  BUG.      pOut->
3a00: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  zComment = 0;.  
3a10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
3a20: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
3a30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3a40: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
3a50: 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69  +addr, &p->aOp[i
3a60: 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d  +addr]);.      }
3a70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
3a80: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
3a90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
3aa0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dr;.}../*.** Cha
3ab0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3ac0: 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   the P1 operand 
3ad0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3ae0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3b00: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
3b10: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
3b20: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
3b30: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
3b40: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
3b50: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
3b60: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
3b70: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
3b80: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
3b90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3ba0: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
3bb0: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
3bc0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
3bd0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
3be0: 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29  f( ((u32)p->nOp)
3bf0: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
3c00: 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76  aOp[addr].p1 = v
3c10: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3c20: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3c30: 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72  e of the P2 oper
3c40: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3c50: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3c60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3c70: 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  is useful for se
3c80: 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73  tting a jump des
3c90: 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  tination..*/.voi
3ca0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3cb0: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75  ngeP2(Vdbe *p, u
3cc0: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
3cd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3ce0: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32  0 );.  if( ((u32
3cf0: 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b  )p->nOp)>addr ){
3d00: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
3d10: 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p2 = val;.  }.
3d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3d30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3d40: 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P3 operand for 
3d50: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
3d60: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
3d70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3d80: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP3(Vdbe *p, u32
3d90: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
3da0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3db0: 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70  );.  if( ((u32)p
3dc0: 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20  ->nOp)>addr ){. 
3dd0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3de0: 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p3 = val;.  }.}.
3df0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3e00: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3e10: 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68  5 operand for th
3e20: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a  e most recently.
3e30: 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69  ** added operati
3e40: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3e50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
3e60: 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29  Vdbe *p, u8 val)
3e70: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3e80: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
3e90: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3ea0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
3eb0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3ec0: 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p5 = val;.  }.}
3ed0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3ee0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
3ef0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
3f00: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
3f10: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
3f20: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
3f30: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
3f40: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
3f50: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
3f60: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
3f70: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73  int addr){.  ass
3f80: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
3f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3fa0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
3fb0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
3fc0: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
3fd0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
3fe0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
3ff0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
4000: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
4010: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
4020: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
4030: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4040: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4050: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
4060: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
4070: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
4080: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
4090: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
40a0: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
40b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
40c0: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
40d0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
40e0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
40f0: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
4100: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4110: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
4120: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
4130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4140: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
4150: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
4160: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
4170: 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p4 ){.    assert
4180: 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74  ( db );.    swit
4190: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
41a0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
41b0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
41c0: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
41d0: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
41e0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
41f0: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
4200: 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20  P4_INTARRAY:.   
4210: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
4220: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
4230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4240: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4250: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4260: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4270: 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20  4_MPRINTF: {.   
4280: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4290: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
42a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b  qlite3_free(p4);
42b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
42c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
42d0: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
42e0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
42f0: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
4300: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a  (VdbeFunc *)p4;.
4310: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
4320: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
4330: 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  , pVdbeFunc->pFu
4340: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
4350: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4360: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
4370: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
4380: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
4390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
43a0: 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75  Free(db, pVdbeFu
43b0: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
43c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
43d0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
43e0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
43f0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
4400: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
4410: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4420: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4430: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4440: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4450: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4460: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4470: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4480: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4490: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
44a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
44b0: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
44c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
44d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
44e0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
44f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4500: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
4510: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
4520: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4530: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4540: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4550: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4560: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4570: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4580: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4590: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
45a0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
45b0: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
45c0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
45d0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
45e0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
45f0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
4600: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
4610: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
4620: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
4630: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4640: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4660: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4670: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4680: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4690: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
46a0: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
46b0: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
46c0: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
46d0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
46e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
46f0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
4700: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4710: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4720: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
4730: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
4740: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
4750: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4760: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  aOp);.}../*.** L
4770: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
4780: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
4790: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
47a0: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
47b0: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
47c0: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
47d0: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
47e0: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
47f0: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
4800: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
4810: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
4820: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
4830: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4840: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
4850: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
4860: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
4870: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
4880: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
4890: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
48a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
48b0: 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74  ge the opcode at
48c0: 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f   addr into OP_No
48d0: 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  op.*/.void sqlit
48e0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
48f0: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
4900: 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  addr){.  if( p->
4910: 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  aOp ){.    VdbeO
4920: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
4930: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69  [addr];.    sqli
4940: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4950: 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20  .    freeP4(db, 
4960: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
4970: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d  ->p4.p);.    mem
4980: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
4990: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
49a0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
49b0: 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  P_Noop;.  }.}../
49c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
49d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
49e0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
49f0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
4a00: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
4a10: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
4a20: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
4a30: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
4a40: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
4a50: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
4a60: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
4a70: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
4a80: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
4a90: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
4aa0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
4ab0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
4ac0: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
4ad0: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
4ae0: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
4af0: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
4b00: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
4b10: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4b20: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
4b30: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
4b40: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
4b50: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
4b60: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
4b70: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
4b80: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
4b90: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
4ba0: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a  tes of zP4..**.*
4bb0: 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  * If n==P4_KEYIN
4bc0: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
4bd0: 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65   zP4 is a pointe
4be0: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
4bf0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
4c00: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
4c10: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
4c20: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
4c30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
4c40: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
4c50: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
4c60: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
4c70: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
4c80: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
4c90: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
4ca0: 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  t zP4 points to 
4cb0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
4cc0: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
4cd0: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
4ce0: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
4cf0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4d00: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
4d10: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
4d20: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
4d30: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
4d40: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
4d50: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
4d60: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
4d70: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
4d80: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
4d90: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
4da0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
4db0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
4dc0: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
4dd0: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
4de0: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
4df0: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
4e00: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
4e10: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
4e20: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
4e30: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
4e40: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
4e50: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
4e60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
4e70: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
4e80: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
4e90: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4ea0: 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP4(Vdbe *p, int
4eb0: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
4ec0: 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP4, int n){.
4ed0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c    Op *pOp;.  sql
4ee0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65  ite3 *db;.  asse
4ef0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
4f00: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
4f10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4f20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
4f30: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30  .  if( p->aOp==0
4f40: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
4f50: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28  iled ){.    if (
4f60: 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26   n!=P4_KEYINFO &
4f70: 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 7b  & n!=P4_VTAB ) {
4f80: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4f90: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
4fa0: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
4fb0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
4fc0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
4fd0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
4fe0: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
4ff0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
5000: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
5010: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
5020: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
5030: 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20  ];.  freeP4(db, 
5040: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
5050: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
5060: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  p4.p = 0;.  if( 
5070: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
5080: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
5090: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
50a0: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
50b0: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
50c0: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
50d0: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
50e0: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
50f0: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
5100: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
5110: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
5120: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5130: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
5140: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
5150: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30     pOp->p4.p = 0
5160: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5170: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
5180: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5190: 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  4_KEYINFO ){.   
51a0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
51b0: 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65  fo;.    int nFie
51c0: 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  ld, nByte;..    
51d0: 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e  nField = ((KeyIn
51e0: 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64  fo*)zP4)->nField
51f0: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
5200: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20  zeof(*pKeyInfo) 
5210: 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a  + (nField-1)*siz
5220: 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  eof(pKeyInfo->aC
5230: 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64  oll[0]) + nField
5240: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
5250: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5260: 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a 20  Raw(0, nByte);. 
5270: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
5280: 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
5290: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
52a0: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53   ){.      u8 *aS
52b0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
52c0: 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 4b  memcpy((char*)pK
52d0: 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79  eyInfo, zP4, nBy
52e0: 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20  te - nField);.  
52f0: 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d      aSortOrder =
5300: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
5310: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28  Order;.      if(
5320: 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20   aSortOrder ){. 
5330: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
5340: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5350: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70  nsigned char*)&p
5360: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  KeyInfo->aColl[n
5370: 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20  Field];.        
5380: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d  memcpy(pKeyInfo-
5390: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f  >aSortOrder, aSo
53a0: 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29  rtOrder, nField)
53b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
53c0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
53d0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65  _KEYINFO;.    }e
53e0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62  lse{.      p->db
53f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
5400: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   1;.      pOp->p
5410: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5420: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ED;.    }.  }els
5430: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49  e if( n==P4_KEYI
5440: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20  NFO_HANDOFF ){. 
5450: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5460: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5470: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5480: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
5490: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
54a0: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
54b0: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
54c0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
54d0: 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71   P4_VTAB;.    sq
54e0: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
54f0: 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20  Table *)zP4);.  
5500: 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62    assert( ((VTab
5510: 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70  le *)zP4)->db==p
5520: 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20  ->db );.  }else 
5530: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
5540: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5550: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5560: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
5570: 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65   char)n;.  }else
5580: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
5590: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
55a0: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
55b0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
55c0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
55d0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
55e0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
55f0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
5600: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
5610: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
5620: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
5630: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5640: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
5650: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
5660: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
5670: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
5680: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
5690: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
56a0: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
56b0: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
56c0: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
56d0: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
56e0: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
56f0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
5700: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5710: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
5720: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5730: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5740: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5750: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
5760: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
5770: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
5780: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
5790: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
57a0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
57b0: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
57c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
57d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
57e0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
57f0: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
5800: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  -1].zComment;.  
5810: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5820: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
5830: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
5840: 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20  , *pz);.    *pz 
5850: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
5860: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
5870: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
5880: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
5890: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
58a0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
58b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
58c0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
58d0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
58e0: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
58f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5900: 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(p, OP_Noop);. 
5910: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5920: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
5930: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
5940: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
5950: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
5960: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
5970: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
5980: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
5990: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
59a0: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31  &p->aOp[p->nOp-1
59b0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ].zComment;.    
59c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
59d0: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
59e0: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
59f0: 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20  *pz);.    *pz = 
5a00: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
5a10: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
5a20: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
5a30: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
5a40: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
5a50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5a60: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
5a70: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49  iven address.  I
5a80: 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73  f the address is
5a90: 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74   -1, then.** ret
5aa0: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
5ab0: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f  ently inserted o
5ac0: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pcode..**.** If 
5ad0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
5ae0: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
5af0: 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20  curred prior to 
5b00: 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74  the calling of t
5b10: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  his.** routine, 
5b20: 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
5b30: 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70  o a dummy VdbeOp
5b40: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
5b50: 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a  d.  That opcode.
5b60: 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62  ** is readable b
5b70: 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c  ut not writable,
5b80: 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61   though it is ca
5b90: 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65  st to a writable
5ba0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
5bb0: 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79  eturn of a dummy
5bc0: 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74   opcode allows t
5bd0: 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69  he call to conti
5be0: 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a  nue functioning.
5bf0: 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66  ** after a OOM f
5c00: 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76  ault without hav
5c10: 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  ing to check to 
5c20: 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72  see if the retur
5c30: 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20  n from .** this 
5c40: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c  routine is a val
5c50: 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74  id pointer.  But
5c60: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d   because the dum
5c70: 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a  my.opcode is 0,.
5c80: 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65  ** dummy will ne
5c90: 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74  ver be written t
5ca0: 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69  o.  This is veri
5cb0: 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73  fied by code ins
5cc0: 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62  pection and.** b
5cd0: 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56  y running with V
5ce0: 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41  algrind..**.** A
5cf0: 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20  bout the #ifdef 
5d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
5d10: 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  E:  Normally, th
5d20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
5d30: 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e  ver called.** un
5d40: 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20  less p->nOp>0.  
5d50: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
5d60: 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f  in the absense o
5d70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5d80: 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72  ACE,.** an OP_Tr
5d90: 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ace instruction 
5da0: 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74  is always insert
5db0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
5dc0: 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61  eGet() as soon a
5dd0: 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20  s.** a new VDBE 
5de0: 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20  is created.  So 
5df0: 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73  we are free to s
5e00: 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f  et addr to p->nO
5e10: 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  p-1 without.** h
5e20: 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d  aving to double-
5e30: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
5e40: 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75  re that the resu
5e50: 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  lt is non-negati
5e60: 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51  ve. But.** if SQ
5e70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
5e80: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20  is defined, the 
5e90: 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74  OP_Trace is omit
5ea0: 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65  ted and we do ne
5eb0: 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74  ed to.** check t
5ec0: 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e  he value of p->n
5ed0: 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74  Op-1 before cont
5ee0: 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f  inuing..*/.VdbeO
5ef0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
5f00: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
5f10: 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39   addr){.  /* C89
5f20: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
5f30: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75  the constant "du
5f40: 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69  mmy" will be ini
5f50: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a  tialized to all.
5f60: 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63    ** zeros, whic
5f70: 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d  h is correct.  M
5f80: 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20  SVC generates a 
5f90: 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68  warning, neverth
5fa0: 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74  eless. */.  stat
5fb0: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
5fc0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
5fd0: 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f  MSVC warning abo
5fe0: 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ut no initialize
5ff0: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
6000: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6010: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
6020: 28 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64  ( addr<0 ){.#ifd
6030: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
6040: 52 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e  RACE.    if( p->
6050: 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nOp==0 ) return 
6060: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
6070: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72  .#endif.    addr
6080: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
6090: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64   }.  assert( (ad
60a0: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
60b0: 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e  >nOp) || p->db->
60c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
60d0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
60e0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
60f0: 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a   return (VdbeOp*
6100: 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65  )&dummy;.  }else
6110: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d  {.    return &p-
6120: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a  >aOp[addr];.  }.
6130: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
6140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
6150: 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  AIN) || !defined
6160: 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20  (NDEBUG) \.     
6170: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
6180: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
6190: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
61a0: 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  )./*.** Compute 
61b0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
61c0: 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70  scribes the P4 p
61d0: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
61e0: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
61f0: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
6200: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
6210: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
6220: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
6230: 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c  splayP4(Op *pOp,
6240: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
6250: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
6260: 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20   *zP4 = zTemp;. 
6270: 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d   assert( nTemp>=
6280: 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  20 );.  switch( 
6290: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
62a0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
62b0: 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63  FO_STATIC:.    c
62c0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
62d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
62e0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
62f0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
6300: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
6310: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6320: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6330: 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c  p, "keyinfo(%d",
6340: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
6350: 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71  d);.      i = sq
6360: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
6370: 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  emp);.      for(
6380: 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d  j=0; j<pKeyInfo-
6390: 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20  >nField; j++){. 
63a0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
63b0: 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
63c0: 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  ->aColl[j];.    
63d0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
63e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
63f0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6400: 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  30(pColl->zName)
6410: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6420: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
6430: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
6440: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
6450: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
6460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6470: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6480: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
6490: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
64a0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
64b0: 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f  rder && pKeyInfo
64c0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
64d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
64e0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b  Temp[i++] = '-';
64f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6500: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
6510: 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e  Temp[i], pColl->
6520: 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20  zName,n+1);.    
6530: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
6540: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6550: 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+4<nTemp-6 ){. 
6560: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6570: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22  &zTemp[i],",nil"
6580: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,4);.          i
6590: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
65a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
65b0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
65c0: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
65d0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
65e0: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
65f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6600: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
6610: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
6620: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
6630: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
6640: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6650: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6660: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
6670: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
6680: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
6690: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
66a0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
66b0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
66c0: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
66d0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
66e0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
66f0: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
6700: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
6710: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
6720: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6730: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
6740: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6750: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6760: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
6770: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
6780: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6790: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
67a0: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
67b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
67c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
67d0: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
67e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
67f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
6800: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
6810: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6820: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
6830: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
6840: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
6850: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6860: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
6870: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
6880: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
6890: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
68a0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
68b0: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  l)==0 );.      i
68c0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
68d0: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
68e0: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
68f0: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
6900: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
6910: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
6920: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6930: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6940: 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  p, "%lld", pMem-
6950: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
6960: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
6970: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
6980: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6990: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
69a0: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
69b0: 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20   pMem->r);.     
69c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
69d0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
69e0: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
69f0: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
6a00: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
6a10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6a20: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6a30: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6a40: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
6a50: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
6a60: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
6a70: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
6a80: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
6a90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6aa0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6ab0: 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70   "vtab:%p:%p", p
6ac0: 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f  Vtab, pVtab->pMo
6ad0: 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  dule);.      bre
6ae0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
6af0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6b00: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
6b10: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6b20: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
6b30: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
6b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b50: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
6b60: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
6b70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6b80: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72  Temp, zTemp, "pr
6b90: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
6ba0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6bb0: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
6bc0: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
6bd0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
6be0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6bf0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
6c00: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
6c10: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
6c20: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
6c30: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
6c40: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6c50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6c60: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
6c70: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
6c80: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
6c90: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
6ca0: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
6cb0: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
6cc0: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
6cd0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
6ce0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6cf0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
6d00: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
6d10: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
6d20: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6d30: 73 65 73 20 74 68 61 74 20 74 68 65 79 20 77 69  ses that they wi
6d40: 6c 6c 20 62 65 20 75 73 69 6e 67 2e 20 20 41 20  ll be using.  A 
6d50: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
6d60: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
6d70: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
6d80: 74 72 65 65 4d 61 73 6b 20 61 6e 64 20 69 73 20  treeMask and is 
6d90: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
6da0: 20 61 6e 64 20 6f 74 68 65 72 20 70 75 72 70 6f   and other purpo
6db0: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
6dc0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6dd0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
6de0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
6df0: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
6e00: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
6e10: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
6e20: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
6e30: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
6e40: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d  eMask)*8 );.  p-
6e50: 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28  >btreeMask |= ((
6e60: 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  yDbMask)1)<<i;. 
6e70: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
6e80: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
6e90: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
6ea0: 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6c  pBt) ){.    p->l
6eb0: 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62  ockMask |= ((yDb
6ec0: 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a  Mask)1)<<i;.  }.
6ed0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
6ee0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
6ef0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
6f00: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
6f10: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
6f20: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
6f30: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
6f40: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
6f50: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
6f60: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
6f70: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
6f80: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
6f90: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
6fa0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
6fb0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
6fc0: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
6fd0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
6fe0: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
6ff0: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
7000: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
7010: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
7020: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
7030: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
7040: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
7050: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
7060: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
7070: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
7080: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
7090: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
70a0: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
70b0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
70c0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
70d0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
70e0: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
70f0: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
7100: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
7110: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
7120: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
7130: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
7140: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
7150: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
7160: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
7170: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
7180: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
7190: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
71a0: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
71b0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
71c0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
71d0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
71e0: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
71f0: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
7200: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
7210: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
7220: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
7230: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
7240: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
7250: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
7260: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
7270: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
7280: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
7290: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
72a0: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
72b0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
72c0: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
72d0: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
72e0: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
72f0: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
7300: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
7310: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7320: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
7330: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79  p){.  int i;.  y
7340: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73  DbMask mask;.  s
7350: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
7360: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
7370: 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d  ;.  if( p->lockM
7380: 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ask==0 ) return;
7390: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
73a0: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
73b0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
73c0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
73d0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
73e0: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62  0, mask=1; i<nDb
73f0: 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d  ; i++, mask += m
7400: 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  ask){.    if( i!
7410: 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d  =1 && (mask & p-
7420: 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26  >lockMask)!=0 &&
7430: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
7440: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
7450: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
7460: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
7470: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
7480: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
7490: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
74a0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
74b0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
74c0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
74d0: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
74e0: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
74f0: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
7500: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
7510: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7520: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
7530: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7540: 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20   yDbMask mask;. 
7550: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
7560: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
7570: 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63  Db;.  if( p->loc
7580: 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72  kMask==0 ) retur
7590: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
75a0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
75b0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
75c0: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
75d0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
75e0: 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e  i=0, mask=1; i<n
75f0: 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d  Db; i++, mask +=
7600: 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20   mask){.    if( 
7610: 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20  i!=1 && (mask & 
7620: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20  p->lockMask)!=0 
7630: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
7640: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
7650: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
7660: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
7670: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
7680: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
7690: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
76a0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
76b0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
76c0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
76d0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
76e0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
76f0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
7700: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7710: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
7720: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
7730: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
7740: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
7750: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
7760: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
7770: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
7780: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34   %4d %4d %4d %-4
7790: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
77a0: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
77b0: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
77c0: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
77d0: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
77e0: 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e  (zPtr));.  fprin
77f0: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
7800: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
7810: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
7820: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
7830: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
7840: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
7850: 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51  p->p5,.#ifdef SQ
7860: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
7870: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f   pOp->zComment ?
7880: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a   pOp->zComment :
7890: 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   "".#else.      
78a0: 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  "".#endif.  );. 
78b0: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
78c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
78d0: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
78e0: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
78f0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
7900: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7910: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
7920: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
7930: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a  .    Mem *pEnd;.
7940: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
7950: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
7960: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
7970: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7980: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
7990: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
79a0: 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b      for(pEnd=&p[
79b0: 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  N]; p<pEnd; p++)
79c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
79d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
79e0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
79f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
7a00: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e     }.    for(pEn
7a10: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b  d=&p[N]; p<pEnd;
7a20: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   p++){.      ass
7a30: 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45  ert( (&p[1])==pE
7a40: 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70  nd || p[0].db==p
7a50: 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20  [1].db );..     
7a60: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
7a70: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
7a80: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
7a90: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7aa0: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
7ab0: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
7ac0: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
7ad0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
7ae0: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
7af0: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
7b00: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
7b10: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
7b20: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
7b30: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
7b40: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
7b50: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
7b60: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
7b70: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
7b80: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
7b90: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
7ba0: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
7bb0: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
7bc0: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
7bd0: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
7be0: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
7bf0: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
7c00: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
7c10: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
7c20: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
7c30: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
7c40: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
7c50: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
7c60: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
7c70: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
7c80: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
7c90: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
7ca0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
7cb0: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
7cc0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
7cd0: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
7ce0: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
7cf0: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
7d00: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
7d10: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
7d20: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
7d30: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
7d40: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
7d50: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
7d60: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
7d70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7d80: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
7d90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7da0: 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  ( p->zMalloc ){.
7db0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7dc0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
7dd0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
7de0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
7df0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
7e00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
7e10: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  l;.    }.    db-
7e20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7e30: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
7e40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
7e50: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
7e60: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
7e70: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
7e80: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
7e90: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
7ea0: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
7eb0: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
7ec0: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
7ed0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
7ee0: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
7ef0: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
7f00: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
7f10: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
7f20: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
7f30: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
7f40: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
7f50: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
7f60: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
7f70: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
7f80: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
7f90: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
7fa0: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
7fb0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
7fc0: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
7fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
7fe0: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
7ff0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8000: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
8010: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
8020: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
8030: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
8040: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
8050: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
8060: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
8070: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
8080: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
8090: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
80a0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
80b0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
80c0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
80d0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
80e0: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
80f0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
8100: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
8110: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
8120: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
8130: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
8140: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
8150: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
8160: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
8170: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
8180: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
8190: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
81a0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
81b0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
81c0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
81d0: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
81e0: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
81f0: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
8200: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
8210: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
8220: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
8230: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
8240: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
8250: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
8260: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
8270: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
8280: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
8290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
82a0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
82b0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
82e0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
82f0: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
8300: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8320: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
8330: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
8340: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
8350: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
8360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
8370: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
8380: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
8390: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
83a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
83b0: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
83c0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
83d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
83e0: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
83f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8400: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
8410: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
8420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8450: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
8460: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
8470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
8480: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
8490: 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65  m *pMem = p->pRe
84a0: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
84b0: 65 6d 5b 31 5d 3b 20 20 2f 2a 20 46 69 72 73 74  em[1];  /* First
84c0: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
84d0: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
84e0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
84f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
8500: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
8510: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
8520: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8530: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
8540: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
8550: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
8560: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
8570: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
8580: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
8590: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
85a0: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
85b0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
85c0: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
85d0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
85e0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
85f0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
8600: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
8610: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
8620: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
8630: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
8640: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20  ay(pMem, 8);..  
8650: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8660: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
8670: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
8680: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
8690: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
86a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
86b0: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
86c0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
86d0: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
86e0: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
86f0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
8700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8710: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
8720: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
8730: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
8740: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
8750: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
8760: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
8770: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
8780: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
8790: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
87a0: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
87b0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
87c0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
87d0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
87e0: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
87f0: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
8800: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
8810: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
8820: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
8830: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
8840: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
8850: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
8860: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
8870: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
8880: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
8890: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
88a0: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
88b0: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
88c0: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
88d0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
88e0: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
88f0: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
8900: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
8910: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
8920: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
8930: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
8940: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
8950: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
8960: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
8970: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
8980: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
8990: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
89a0: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
89b0: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
89c0: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
89d0: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
89e0: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
89f0: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
8a00: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
8a10: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
8a20: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
8a30: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
8a40: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
8a50: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
8a60: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
8a70: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
8a80: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
8a90: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
8aa0: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
8ab0: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
8ac0: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
8ad0: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
8ae0: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
8af0: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
8b00: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
8b10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8b20: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
8b30: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
8b40: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
8b50: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
8b60: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
8b70: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
8b80: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
8b90: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8ba0: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
8bb0: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
8bc0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
8bd0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
8be0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8bf0: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
8c00: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
8c10: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
8c20: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
8c30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8c40: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
8c50: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
8c60: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
8c70: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
8c80: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
8c90: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
8ca0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
8cb0: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
8cc0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
8cd0: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
8ce0: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
8cf0: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
8d00: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
8d10: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
8d20: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
8d30: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
8d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
8d50: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
8d60: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
8d70: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
8d80: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
8d90: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
8da0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8db0: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
8dc0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
8dd0: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
8de0: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
8df0: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
8e00: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
8e10: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
8e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
8e30: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
8e40: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
8e50: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
8e60: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
8e70: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8e80: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
8e90: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
8ea0: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
8eb0: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
8ee0: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
8ef0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
8f00: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
8f10: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
8f20: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
8f30: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
8f40: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
8f50: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
8f60: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
8f70: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
8f80: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
8f90: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8fa0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8fb0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
8fc0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
8fd0: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
8fe0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
8ff0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9000: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
9010: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
9020: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
9030: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
9040: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
9050: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
9060: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
9070: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
9080: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
9090: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
90a0: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
90b0: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
90c0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
90d0: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
90e0: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
90f0: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
9100: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
9110: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
9120: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
9130: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
9140: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
9150: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
9160: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
9170: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
9180: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
9190: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
91a0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
91b0: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
91c0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
91d0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
91e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
91f0: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
9200: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
9210: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
9220: 20 6e 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20   nByte, 1) ){.  
9230: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
9240: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
9250: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
9260: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
9270: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
9280: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
9290: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
92a0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
92b0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
92c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
92d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
92e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
92f0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9300: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
9310: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
9320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
9340: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
9350: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
9360: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
9370: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
9380: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
9390: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
93a0: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
93c0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
93d0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
93e0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
93f0: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
9400: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
9410: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
9420: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
9450: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9460: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
9470: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
9480: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
9490: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
94a0: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
94b0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
94c0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
94d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
94e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
94f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
9500: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9510: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
9520: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
9530: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
9540: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
9550: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
9560: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
9570: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
9580: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
9590: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
95a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
95b0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
95c0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
95d0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
95e0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
95f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
9600: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
9610: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
9620: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
9630: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
9640: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
9650: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
9660: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
9670: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
9680: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
9690: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
96a0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
96b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
96c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
96d0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
96e0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
96f0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
9700: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
9710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9720: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
9730: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
9740: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
9750: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
9760: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
9770: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
9780: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
9790: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
97a0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
97b0: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
97c0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
97d0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
97e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
97f0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
9800: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
9810: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
9820: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
9830: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
9840: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
9850: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
9860: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
9870: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9880: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d  TE_TEXT;.      }
9890: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
98a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    {.        pMem
98b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
98c0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
98d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
98e0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
98f0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9900: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_NULL;.      
9910: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  }.    }..    p->
9920: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
9930: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
9940: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  );.    p->rc = S
9950: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
9960: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
9970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9980: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9990: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
99a0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
99b0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
99c0: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
99d0: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
99e0: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
99f0: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
9a00: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
9a10: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
9a20: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
9a30: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
9a40: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
9a50: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
9a60: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
9a70: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
9a80: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
9a90: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  z!=0 ){.    cons
9aa0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
9ab0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65  >p4.z;.    while
9ac0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
9ad0: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
9ae0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
9af0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
9b00: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
9b10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9b20: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
9b30: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9b40: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
9b50: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
9b60: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
9b70: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
9b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9b90: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
9ba0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
9bb0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
9bc0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
9bd0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
9be0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9bf0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
9c00: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
9c10: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
9c20: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
9c30: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
9c40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
9c50: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
9c60: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
9c70: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
9c80: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
9c90: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
9ca0: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
9cb0: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
9cc0: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
9cd0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
9ce0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
9cf0: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
9d00: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
9d10: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
9d20: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
9d30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9d50: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
9d60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9d70: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
9d80: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
9d90: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
9da0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
9db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9dc0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
9dd0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
9de0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
9df0: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
9e00: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
9e10: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
9e20: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
9e30: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
9e40: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
9e50: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
9e60: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
9e70: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
9e80: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
9e90: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
9ea0: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
9eb0: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
9ec0: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
9ed0: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
9ee0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
9ef0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
9f00: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
9f10: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
9f20: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
9f30: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
9f40: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
9f50: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
9f60: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
9f70: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
9f80: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
9f90: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
9fa0: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
9fb0: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
9fc0: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
9fd0: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
9fe0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9ff0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
a000: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
a010: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
a020: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
a030: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
a040: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
a050: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
a060: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
a070: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
a080: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
a090: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
a0a0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
a0b0: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
a0c0: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
a0d0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
a0e0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
a0f0: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
a100: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
a110: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
a120: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
a130: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
a140: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
a150: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
a160: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
a170: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
a180: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
a190: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
a1a0: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
a1b0: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
a1c0: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
a1d0: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
a1e0: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
a1f0: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
a200: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
a210: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
a220: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
a230: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
a240: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
a250: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
a260: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
a270: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
a280: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
a290: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
a2a0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
a2b0: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
a2c0: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
a2d0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
a2e0: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
a2f0: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
a300: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
a310: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
a320: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
a330: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
a340: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
a350: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
a360: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
a370: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
a380: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
a390: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
a3a0: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
a3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
a3c0: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
a3d0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
a3e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
a3f0: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
a400: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
a410: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
a420: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
a430: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a440: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
a450: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
a460: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
a470: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
a480: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
a490: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
a4a0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
a4b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
a4c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
a4d0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
a4e0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
a4f0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
a500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
a510: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
a520: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
a530: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
a540: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
a550: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
a560: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
a570: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
a580: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
a590: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=1; i<p->nMem
a5a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
a5b0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
a5c0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
a5d0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
a5e0: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
a5f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
a600: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
a610: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69  Abort;.  p->magi
a620: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
a630: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
a640: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
a650: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
a660: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
a670: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
a680: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
a690: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
a6a0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
a6b0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
a6c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
a6d0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
a6e0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
a6f0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
a700: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
a710: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
a720: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
a730: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
a740: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
a750: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
a760: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
a770: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
a780: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
a790: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
a7a0: 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61  cating stack spa
a7b0: 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ce and initializ
a7c0: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
a7d0: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
a7e0: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
a7f0: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
a800: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
a810: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
a820: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
a830: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
a840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a850: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
a860: 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e 20 61 20  exact once on a 
a870: 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63  each virtual mac
a880: 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74  hine..** After t
a890: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a8a0: 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73  alled the VM has
a8b0: 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22   been "packaged"
a8c0: 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a   and is ready.**
a8d0: 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20   to run.  After 
a8e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a8f0: 63 61 6c 6c 65 64 2c 20 66 75 74 68 65 72 20 63  called, futher c
a900: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  alls to .** sqli
a910: 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66  te3VdbeAddOp() f
a920: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f  unctions are pro
a930: 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72  hibited.  This r
a940: 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63  outine disconnec
a950: 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66  ts.** the Vdbe f
a960: 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62  rom the Parse ob
a970: 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64  ject that helped
a980: 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20   generate it so 
a990: 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20  that the.** the 
a9a0: 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20  Vdbe becomes an 
a9b0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69  independent enti
a9c0: 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65  ty and the Parse
a9d0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a   object can be.*
a9e0: 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  * destroyed..**.
a9f0: 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  ** Use the sqlit
aa00: 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70  e3VdbeRewind() p
aa10: 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74  rocedure to rest
aa20: 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  ore a virtual ma
aa30: 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f  chine back.** to
aa40: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61   its initial sta
aa50: 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20  te after it has 
aa60: 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  been run..*/.voi
aa70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
aa80: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
aa90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
aaa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
aab0: 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20  VDBE */.  Parse 
aac0: 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20  *pParse         
aad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
aae0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29  ing context */.)
aaf0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
ab20: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
ab30: 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20  .  int nVar;    
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
ab60: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69  arameters */.  i
ab70: 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  nt nMem;        
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ab90: 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65   Number of VM me
aba0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a  mory registers *
abb0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b  /.  int nCursor;
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
abe0: 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64  cursors required
abf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ac20: 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73  f arguments in s
ac30: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
ac40: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac60: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ac70: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20  /.  u8 *zCsr;   
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
aca0: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
acb0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  ation */.  u8 *z
acc0: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
acd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
ace0: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c  st byte past all
acf0: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
ad00: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
ad30: 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65  tra memory is ne
ad40: 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eded */..  asser
ad50: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
ad60: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
ad70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
ad80: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
ad90: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
ada0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
adb0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
adc0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
add0: 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  cFailed==0 );.  
ade0: 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nVar = pParse->n
adf0: 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50  Var;.  nMem = pP
ae00: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43  arse->nMem;.  nC
ae10: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
ae20: 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70  nTab;.  nArg = p
ae30: 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a  Parse->nMaxArg;.
ae40: 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68    .  /* For each
ae50: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64   cursor required
ae60: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  , also allocate 
ae70: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d  a memory cell. M
ae80: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73  emory.  ** cells
ae90: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72   (nMem+1-nCursor
aea0: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69  )..nMem, inclusi
aeb0: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ve, will never b
aec0: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74  e used by.  ** t
aed0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e  he vdbe program.
aee0: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72   Instead they ar
aef0: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  e used to alloca
af00: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a  te space for.  *
af10: 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43  * VdbeCursor/BtC
af20: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73  ursor structures
af30: 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  . The blob of me
af40: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
af50: 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f  with .  ** curso
af60: 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e  r 0 is stored in
af70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65   memory cell nMe
af80: 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  m. Memory cell (
af90: 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f  nMem-1).  ** sto
afa0: 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  res the blob of 
afb0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
afc0: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c  d with cursor 1,
afd0: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
afe0: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
aff0: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
b000: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
b010: 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  or;..  /* Alloca
b020: 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
b030: 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53  ory registers, S
b040: 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44  QL variables, VD
b050: 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a  BE cursors and .
b060: 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f    ** an array to
b070: 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e   marshal SQL fun
b080: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
b090: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20  in..  */.  zCsr 
b0a0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
b0b0: 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a  ->nOp];       /*
b0c0: 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c   Memory avaliabl
b0d0: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
b0e0: 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38   */.  zEnd = (u8
b0f0: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  *)&p->aOp[p->nOp
b100: 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73  Alloc];  /* Firs
b110: 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  t byte past end 
b120: 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20  of zCsr[] */..  
b130: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
b140: 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e  p, &nArg);.  p->
b150: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
b160: 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69  = (u8)(pParse->i
b170: 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70  sMultiWrite && p
b180: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
b190: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
b1a0: 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c  explain && nMem<
b1b0: 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d  10 ){.    nMem =
b1c0: 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65   10;.  }.  memse
b1d0: 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d  t(zCsr, 0, zEnd-
b1e0: 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d  zCsr);.  zCsr +=
b1f0: 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29   (zCsr - (u8*)0)
b200: 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  &7;.  assert( EI
b210: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
b220: 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d  NT(zCsr) );.  p-
b230: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20  >expired = 0;.. 
b240: 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72   /* Memory for r
b250: 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65  egisters, parame
b260: 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74  ters, cursor, et
b270: 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  c, is allocated 
b280: 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73  in two.  ** pass
b290: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
b2a0: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
b2b0: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73  o reuse unused s
b2c0: 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a  pace at the .  *
b2d0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  * end of the opc
b2e0: 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77  ode array.  If w
b2f0: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
b300: 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f  satisfy all memo
b310: 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d  ry.  ** requirem
b320: 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20  ents by reusing 
b330: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
b340: 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20   tail, then the 
b350: 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73  second.  ** pass
b360: 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68   will fill in th
b370: 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66  e rest using a f
b380: 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  resh allocation.
b390: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
b3a0: 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f  s two-pass appro
b3b0: 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20  ach that reuses 
b3c0: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
b3d0: 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a  s possible from.
b3e0: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
b3f0: 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  r space at the e
b400: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
b410: 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69   array can signi
b420: 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65  ficantly.  ** re
b430: 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
b440: 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
b450: 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
b460: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64  tement..  */.  d
b470: 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  o {.    nByte = 
b480: 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  0;.    p->aMem =
b490: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
b4a0: 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
b4b0: 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (Mem), &zCsr, zE
b4c0: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b4d0: 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63   p->aVar = alloc
b4e0: 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e  Space(p->aVar, n
b4f0: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Var*sizeof(Mem),
b500: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b510: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Byte);.    p->ap
b520: 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Arg = allocSpace
b530: 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a  (p->apArg, nArg*
b540: 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a  sizeof(Mem*), &z
b550: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
b560: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72  e);.    p->azVar
b570: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b580: 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  >azVar, nVar*siz
b590: 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73  eof(char*), &zCs
b5a0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b5b0: 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d  ;.    p->apCsr =
b5c0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
b5d0: 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69  pCsr, nCursor*si
b5e0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
b5f0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43               &zC
b610: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b620: 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
b630: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72   ){.      p->pFr
b640: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
b650: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
b660: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  te);.    }.    z
b670: 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a  Csr = p->pFree;.
b680: 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72      zEnd = &zCsr
b690: 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c  [nByte];.  }whil
b6a0: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
b6b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b6c0: 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d  ..  p->nCursor =
b6d0: 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20   (u16)nCursor;. 
b6e0: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a   if( p->aVar ){.
b6f0: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79      p->nVar = (y
b700: 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66  nVar)nVar;.    f
b710: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
b720: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
b730: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
b740: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70  EM_Null;.      p
b750: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
b760: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  b;.    }.  }.  i
b770: 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20  f( p->azVar ){. 
b780: 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50     p->nzVar = pP
b790: 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20  arse->nzVar;.   
b7a0: 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72   memcpy(p->azVar
b7b0: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
b7c0: 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66   p->nzVar*sizeof
b7d0: 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  (p->azVar[0]));.
b7e0: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73      memset(pPars
b7f0: 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61  e->azVar, 0, pPa
b800: 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  rse->nzVar*sizeo
b810: 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  f(pParse->azVar[
b820: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
b830: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70  p->aMem ){.    p
b840: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b860: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
b870: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
b880: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
b890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b8a0: 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66    /*       not f
b8b0: 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f  rom 0..nMem-1 */
b8c0: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c  .    for(n=1; n<
b8d0: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
b8e0: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
b8f0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
b900: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
b910: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
b920: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e    }.  p->explain
b930: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
b940: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  in;.  sqlite3Vdb
b950: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
b960: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
b970: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
b980: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
b990: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
b9a0: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
b9b0: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
b9c0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
b9d0: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
b9e0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
b9f0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
ba00: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
ba10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  .  sqlite3VdbeSo
ba20: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
ba30: 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78   pCx);.  if( pCx
ba40: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
ba50: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
ba60: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
ba70: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
ba80: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
ba90: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
baa0: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
bab0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
bac0: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
bad0: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
bae0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
baf0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
bb00: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
bb10: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
bb20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
bb30: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
bb40: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
bb50: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
bb60: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
bb70: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
bb80: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
bb90: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
bba0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78  e *pModule = pCx
bbb0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70  ->pModule;.    p
bbc0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
bbd0: 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d   1;.    pModule-
bbe0: 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
bbf0: 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  sor);.    p->inV
bc00: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
bc10: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
bc20: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
bc30: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
bc40: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
bc50: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
bc60: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
bc70: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
bc80: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
bc90: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
bca0: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
bcb0: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
bcc0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
bcd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
bce0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
bcf0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
bd00: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
bd10: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61  Frame->v;.  v->a
bd20: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
bd30: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
bd40: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
bd50: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
bd60: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
bd70: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
bd80: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
bd90: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
bda0: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
bdb0: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
bdc0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
bdd0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
bde0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
bdf0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
be00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
be10: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
be20: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
be30: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
be40: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
be50: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
be60: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
be70: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
be80: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
be90: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
bea0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
beb0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
bec0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
bed0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
bee0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
bef0: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
bf00: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
bf10: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
bf20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
bf30: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
bf40: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
bf50: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
bf60: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
bf70: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
bf80: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
bf90: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
bfa0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
bfb0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
bfc0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
bfd0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a  re(pFrame);.  }.
bfe0: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
bff0: 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30  .  p->nFrame = 0
c000: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ;..  if( p->apCs
c010: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
c020: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c030: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
c040: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
c050: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
c060: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
c070: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
c080: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
c090: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
c0a0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
c0b0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
c0c0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
c0d0: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
c0e0: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
c0f0: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
c100: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
c110: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
c120: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
c130: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
c140: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
c150: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
c160: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
c170: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
c180: 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pDel);.  }.}../*
c190: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
c1a0: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
c1b0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
c1c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
c1d0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
c1e0: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
c1f0: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
c200: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
c210: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
c220: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
c230: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
c240: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
c250: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
c260: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
c270: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
c280: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
c290: 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  >db;..#ifdef SQL
c2a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
c2b0: 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
c2c0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
c2d0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
c2e0: 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
c2f0: 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
c300: 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
c310: 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
c320: 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  d up.  */.  int 
c330: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c340: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
c350: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
c360: 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72  r==0 || p->apCsr
c370: 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  [i]==0 );.  for(
c380: 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  i=1; i<=p->nMem;
c390: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
c3a0: 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61  >aMem==0 || p->a
c3b0: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
c3c0: 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66  M_Null );.#endif
c3d0: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
c3e0: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
c3f0: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
c400: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
c410: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
c420: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
c430: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
c440: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
c450: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
c460: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
c470: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
c480: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
c490: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
c4a0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
c4b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
c4c0: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
c4d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c4e0: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
c4f0: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
c500: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
c510: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
c520: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
c530: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c540: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
c550: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
c560: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
c570: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
c580: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
c590: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c5a0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
c5b0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c5c0: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
c5d0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
c5e0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
c5f0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c600: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
c610: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
c620: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
c630: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
c640: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
c650: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c660: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
c670: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
c680: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
c690: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
c6a0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
c6b0: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
c6c0: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
c6d0: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
c6e0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
c6f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
c700: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c710: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
c720: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
c730: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
c740: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
c750: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
c760: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
c770: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
c780: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
c790: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
c7a0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
c7b0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
c7c0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
c7d0: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
c7e0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
c7f0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
c800: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
c810: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
c820: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
c830: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
c840: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
c850: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
c860: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
c870: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
c880: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
c890: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
c8a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
c8b0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
c8c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
c8f0: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
c900: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
c930: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
c940: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
c950: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c970: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
c980: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
c990: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c9a0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
c9b0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
c9c0: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
c9d0: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
c9e0: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
c9f0: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
ca00: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
ca10: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
ca20: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
ca30: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
ca40: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
ca50: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
ca60: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
ca70: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
ca80: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
ca90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
caa0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
cab0: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
cac0: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
cad0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cae0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
caf0: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
cb00: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
cb10: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
cb20: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
cb30: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
cb40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
cb50: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
cb60: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
cb70: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
cb80: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
cb90: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
cba0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
cbb0: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
cbc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cbd0: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
cbe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
cbf0: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
cc00: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
cc10: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
cc20: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
cc30: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
cc40: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
cc50: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
cc60: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
cc70: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
cc80: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
cc90: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
cca0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
ccb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ccc0: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
ccd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
cce0: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
ccf0: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
cd00: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
cd10: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
cd20: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
cd30: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
cd40: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
cd50: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
cd60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
cd70: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
cd80: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
cd90: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
cda0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
cdb0: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
cdc0: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
cdd0: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
cde0: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
cdf0: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
ce00: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
ce10: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
ce20: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
ce30: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
ce40: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
ce50: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
ce60: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
ce70: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
ce80: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
ce90: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
cea0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
ceb0: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
cec0: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
ced0: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
cee0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cef0: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
cf00: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
cf10: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
cf20: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
cf30: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
cf40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
cf50: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
cf60: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
cf70: 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20  &p->zErrMsg);.. 
cf80: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
cf90: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
cfa0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
cfb0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
cfc0: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
cfd0: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
cfe0: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
cff0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
d000: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
d010: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
d020: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
d030: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
d040: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
d050: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
d060: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
d070: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
d080: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
d090: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
d0a0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
d0b0: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
d0c0: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
d0d0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d0e0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d0f0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
d100: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d110: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
d120: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
d130: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
d140: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
d150: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
d160: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
d170: 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  +;.      rc = sq
d180: 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
d190: 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
d1a0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
d1b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d1c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d1d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d1e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d1f0: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
d200: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
d210: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
d220: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
d230: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
d240: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
d250: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
d260: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
d270: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
d280: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
d290: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
d2a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
d2b0: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20  STRAINT;.    }. 
d2c0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
d2d0: 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
d2e0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
d2f0: 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
d300: 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
d310: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
d320: 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
d330: 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
d340: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
d350: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
d360: 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
d370: 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
d380: 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
d390: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
d3a0: 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
d3b0: 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
d3c0: 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
d3d0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
d3e0: 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
d3f0: 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
d400: 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
d410: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
d420: 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
d430: 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
d440: 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
d450: 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
d460: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
d470: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d480: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
d490: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
d4a0: 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
d4b0: 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
d4c0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d4d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d4e0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d4f0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d500: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d510: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
d520: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d530: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d540: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
d550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d560: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
d570: 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
d580: 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
d590: 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
d5a0: 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
d5b0: 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
d5c0: 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
d5d0: 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
d5e0: 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
d5f0: 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
d600: 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
d610: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d620: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
d630: 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
d640: 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
d650: 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
d660: 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
d670: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
d680: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
d690: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
d6a0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
d6b0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
d6c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
d6d0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d6e0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
d6f0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
d700: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d710: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
d720: 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
d730: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d740: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d750: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d760: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
d770: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d780: 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
d790: 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
d7a0: 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
d7b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
d7c0: 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
d7d0: 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
d7e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d7f0: 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
d800: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
d810: 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c  ommitted atomicl
d820: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
d830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
d840: 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
d850: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d860: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
d870: 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
d880: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  0;.    char *zMa
d890: 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
d8a0: 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
d8b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d8c0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
d8d0: 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
d8e0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
d8f0: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
d900: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
d910: 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
d920: 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
d930: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
d940: 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20  nt res;..    /* 
d950: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
d960: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d970: 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e */.    do {.  
d980: 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
d990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
d9a0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
d9b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d9c0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
d9d0: 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
d9e0: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
d9f0: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
da00: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
da10: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
da20: 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66  e, iRandom&0x7ff
da30: 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66  fffff);.      if
da40: 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !zMaster ){.  
da50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
da60: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
da70: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
da80: 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69  FileSuffix3(zMai
da90: 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b  nFile, zMaster);
daa0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dab0: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
dac0: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
dad0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
dae0: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
daf0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
db00: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
db10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
db20: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
db30: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
db40: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
db50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
db60: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
db70: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
db80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
db90: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
dba0: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
dbb0: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
dbc0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
dbd0: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
dbe0: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
dbf0: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
dc00: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
dc10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dc20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
dc30: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
dc40: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
dc50: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
dc60: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
dc70: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
dc80: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
dc90: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
dca0: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
dcb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
dcc0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
dcd0: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
dce0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
dcf0: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
dd00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
dd10: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
dd20: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
dd30: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
dd40: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
dd50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
dd60: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
dd70: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
dd80: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
dd90: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
dda0: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
ddb0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
ddc0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ddd0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
dde0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
ddf0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
de00: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
de10: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
de20: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
de30: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
de40: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
de50: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
de60: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
de70: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
de80: 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
de90: 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
dea0: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
deb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dec0: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
ded0: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
dee0: 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
def0: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
df00: 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
df10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
df20: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
df30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
df40: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
df50: 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
df60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
df70: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
df80: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
df90: 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
dfa0: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
dfb0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
dfc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dfd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
dfe0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
dff0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
e000: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
e010: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
e020: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e030: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
e040: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
e050: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e060: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e070: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
e080: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e090: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
e0a0: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
e0b0: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
e0c0: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
e0d0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
e0e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e0f0: 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
e100: 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
e110: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
e120: 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
e130: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
e140: 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
e150: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
e160: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
e170: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
e180: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
e190: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e1a0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
e1b0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
e1c0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
e1d0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
e1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e1f0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
e200: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
e210: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
e220: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
e230: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
e240: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
e250: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
e260: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
e270: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e280: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
e290: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
e2a0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
e2b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
e2c0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
e2d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
e2e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
e2f0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
e300: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
e310: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
e320: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
e330: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
e340: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
e350: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
e360: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
e370: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
e380: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
e390: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
e3a0: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
e3b0: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
e3c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e3d0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
e3e0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
e3f0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
e400: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
e410: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
e420: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
e430: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
e440: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
e450: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
e460: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
e470: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
e480: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
e490: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e4a0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
e4b0: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
e4c0: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
e4d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
e4e0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
e4f0: 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
e500: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
e510: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
e520: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e530: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e540: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
e550: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e560: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
e570: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
e590: 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
e5a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
e5b0: 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
e5c0: 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
e5d0: 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
e5e0: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
e5f0: 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
e600: 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
e610: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
e620: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
e630: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
e640: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
e650: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
e660: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e670: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
e680: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
e690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e6a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
e6b0: 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
e6c0: 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
e6d0: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
e6e0: 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
e6f0: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
e700: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
e710: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
e720: 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
e730: 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
e740: 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
e750: 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
e760: 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
e770: 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
e780: 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
e790: 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
e7a0: 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
e7b0: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
e7c0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
e7d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
e7e0: 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
e7f0: 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
e800: 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
e810: 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
e820: 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
e830: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
e840: 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
e850: 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
e860: 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
e870: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
e880: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
e890: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
e8a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e8b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e8c0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
e8d0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e8e0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
e8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e900: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
e910: 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
e920: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e930: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
e940: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
e950: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
e960: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
e970: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
e980: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
e990: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
e9a0: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
e9b0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
e9c0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
e9d0: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
e9e0: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
e9f0: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
ea00: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
ea10: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
ea20: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
ea30: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
ea40: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
ea50: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
ea60: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
ea70: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
ea80: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
ea90: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
eaa0: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
eab0: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
eac0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
ead0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
eae0: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
eaf0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
eb00: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
eb10: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
eb20: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
eb30: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
eb40: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
eb50: 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
eb60: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
eb70: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
eb80: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
eb90: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
eba0: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
ebb0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
ebc0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
ebd0: 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
ebe0: 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  te++;.    }.    
ebf0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
ec00: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
ec10: 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  =db->activeVdbeC
ec20: 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
ec30: 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74  nWrite==db->writ
ec40: 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65  eVdbeCnt );.}.#e
ec50: 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
ec60: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
ec70: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
ec80: 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20  For every Btree 
ec90: 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65  that in database
eca0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77   connection db w
ecb0: 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65  hich .** has bee
ecc0: 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69  n modified, "tri
ecd0: 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65  p" or invalidate
ece0: 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a   each cursor in.
ecf0: 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69  ** that Btree mi
ed00: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  ght have been mo
ed10: 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74  dified so that t
ed20: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
ed30: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
ed40: 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70  gain.  This happ
ed50: 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  ens when a rollb
ed60: 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20  ack.*** occurs. 
ed70: 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70   We have to trip
ed80: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
ed90: 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20  ursors, even.** 
eda0: 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65  cursor from othe
edb0: 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65  r VMs in differe
edc0: 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  nt database conn
edd0: 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74  ections,.** so t
ede0: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d  hat none of them
edf0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
ee00: 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68  data at which th
ee10: 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74  ey.** were point
ee20: 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f  ing and which no
ee30: 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  w may have been 
ee40: 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74  changed due.** t
ee50: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
ee60: 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  **.** Remember t
ee70: 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63  hat a rollback c
ee80: 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73  an delete tables
ee90: 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a   complete and.**
eea0: 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67   reorder rootpag
eeb0: 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f  es.  So it is no
eec0: 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73  t sufficient jus
eed0: 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65  t to save.** the
eee0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
eef0: 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74  rsor.  We have t
ef00: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  o invalidate the
ef10: 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68   cursor.** so th
ef20: 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75  at it is never u
ef30: 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74  sed again..*/.st
ef40: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
ef50: 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
ef60: 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69  ifiedBtrees(sqli
ef70: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
ef80: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
ef90: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
efa0: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
efb0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
efc0: 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74    if( p && sqlit
efd0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
efe0: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
eff0: 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
f000: 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54  Cursors(p, SQLIT
f010: 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a  E_ABORT);.    }.
f020: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
f030: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
f040: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
f050: 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
f060: 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
f070: 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
f080: 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
f090: 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
f0a0: 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
f0b0: 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
f0c0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
f0d0: 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
f0e0: 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
f0f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
f100: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
f110: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
f120: 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
f130: 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
f140: 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
f150: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
f160: 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a   commtted..**.**
f170: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f180: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54  occurs, an SQLIT
f190: 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
f1a0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
f1b0: 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
f1c0: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
f1d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
f1e0: 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
f1f0: 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
f200: 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73  .  sqlite3 *cons
f210: 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  t db = p->db;.  
f220: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f230: 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e  OK;..  /* If p->
f240: 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72  iStatement is gr
f250: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
f260: 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20   then this Vdbe 
f270: 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73  opened a .  ** s
f280: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
f290: 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64  tion that should
f2a0: 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e   be closed here.
f2b0: 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74   The only except
f2c0: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74  ion.  ** is that
f2d0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79   an IO error may
f2e0: 20 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20 63   have occured, c
f2f0: 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65  ausing an emerge
f300: 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  ncy rollback..  
f310: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
f320: 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d  (db->nStatement=
f330: 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69  =0), and there i
f340: 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  s nothing to do.
f350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
f360: 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
f370: 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
f380: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
f390: 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
f3a0: 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
f3b0: 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
f3c0: 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
f3d0: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
f3e0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
f3f0: 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
f400: 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
f410: 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
f420: 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
f430: 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
f440: 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
f450: 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
f460: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
f470: 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
f480: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
f490: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
f4a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f4b0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
f4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f4d0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f4e0: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
f4f0: 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
f500: 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
f510: 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
f520: 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
f530: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
f540: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
f550: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f560: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
f570: 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
f580: 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
f590: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
f5a0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f5b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
f5c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f5d0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f5e0: 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
f5f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f600: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
f610: 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
f620: 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ment = 0;..    i
f630: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f640: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
f650: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
f660: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
f670: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
f680: 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
f690: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f6a0: 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
f6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f6c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f6d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f6e0: 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
f6f0: 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
f700: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
f710: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
f720: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f730: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
f740: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
f750: 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
f760: 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
f770: 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
f780: 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
f790: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
f7a0: 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
f7b0: 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
f7c0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
f7d0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f7e0: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
f7f0: 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
f800: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f810: 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
f820: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
f830: 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
f840: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f850: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f860: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
f870: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
f880: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
f890: 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
f8a0: 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
f8b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
f8c0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
f8d0: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
f8e0: 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
f8f0: 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
f900: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
f910: 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
f920: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
f930: 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
f940: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
f950: 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
f960: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
f970: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
f980: 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
f990: 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
f9a0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
f9b0: 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
f9c0: 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
f9d0: 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
f9e0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
f9f0: 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20  NT and write.** 
fa00: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
fa10: 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
fa20: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
fa30: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
fa40: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
fa50: 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
fa60: 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
fa70: 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
fa80: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
fa90: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
faa0: 20 28 64 65 66 65 72 72 65 64 20 26 26 20 64 62   (deferred && db
fab0: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e  ->nDeferredCons>
fac0: 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64  0) || (!deferred
fad0: 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
fae0: 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20 70  aint>0) ){.    p
faf0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
fb00: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d  NSTRAINT;.    p-
fb10: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
fb20: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
fb30: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
fb40: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
fb50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
fb60: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
fb70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fb80: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
fb90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fba0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
fbb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fbc0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
fbd0: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
fbe0: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
fbf0: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
fc00: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
fc10: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
fc20: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
fc30: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
fc40: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
fc50: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
fc60: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
fc70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
fc80: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
fc90: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
fca0: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
fcb0: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
fcc0: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
fcd0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
fce0: 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
fcf0: 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
fd00: 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
fd10: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
fd20: 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
fd30: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
fd40: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
fd50: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
fd60: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
fd70: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
fd80: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
fd90: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
fda0: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
fdb0: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
fdc0: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
fdd0: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
fde0: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
fdf0: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
fe00: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
fe10: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
fe20: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe40: 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
fe50: 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
fe60: 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
fe70: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
fe80: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
fe90: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
fea0: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
feb0: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
fec0: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
fed0: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
fee0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
fef0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
ff00: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
ff10: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
ff20: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
ff30: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
ff40: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
ff50: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
ff60: 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
ff70: 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
ff80: 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
ff90: 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
ffa0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
ffb0: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
ffc0: 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
ffd0: 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
ffe0: 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
fff0: 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
10000 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
10010 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
10020 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
10030 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
10040 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
10050 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
10060 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
10070 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
10080 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
10090 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
100a0 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
100b0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
100c0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
100d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
100e0 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
100f0 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
10100 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
10110 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
10120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10130 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
10140 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
10150 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
10160 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
10170 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
10180 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
10190 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  d */.  if( p->pc
101a0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  >=0 ){.    int m
101b0 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
101c0 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
101d0 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e   p->rc */.    in
101e0 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d  t eStatementOp =
101f0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70   0;.    int isSp
10200 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
10210 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
10220 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63   true if a 'spec
10230 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20  ial' error */.. 
10240 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
10250 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
10260 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
10270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
10280 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ter(p);..    /* 
10290 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66  Check for one of
102a0 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
102b0 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d  ors */.    mrc =
102c0 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20   p->rc & 0xff;. 
102d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
102e0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
102f0 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68  LOCKED );  /* Th
10300 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67  is error no long
10310 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  er exists */.   
10320 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
10330 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
10340 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
10350 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
10370 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
10380 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
10390 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
103a0 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
103b0 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
103c0 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
103d0 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
103e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
103f0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
10400 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
10410 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
10420 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
10430 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
10440 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
10450 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
10460 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
10470 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
10480 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
10490 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
104a0 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
104b0 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
104c0 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
104d0 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
104e0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
104f0 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
10500 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
10510 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
10520 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
10530 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
10540 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 65 64        ** occured
10550 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
10560 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
10570 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
10580 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
10590 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
105a0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
105b0 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
105c0 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
105d0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
105e0 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
105f0 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
10600 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
10610 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
10620 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
10630 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
10640 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10650 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
10660 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
10670 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
10680 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
10690 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
106a0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
106b0 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
106c0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
106d0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
106e0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
106f0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
10700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10710 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
10720 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
10730 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
10740 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
10750 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
10760 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
10770 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
10780 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
10790 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
107a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
107b0 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64           invalid
107c0 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
107d0 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a  fiedBtrees(db);.
107e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
107f0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
10800 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10810 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
10820 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
10830 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
10840 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
10850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10860 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
10870 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
10880 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
10890 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
108a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
108b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108c0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
108d0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
108e0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
108f0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
10900 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
10910 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
10920 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
10930 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
10940 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
10950 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
10960 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
10970 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
10980 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
10990 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
109a0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
109b0 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
109c0 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
109d0 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
109e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
109f0 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
10a00 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
10a10 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
10a20 20 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64    && db->writeVd
10a30 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f  beCnt==(p->readO
10a40 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a  nly==0) .    ){.
10a50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
10a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
10a70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
10a80 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
10a90 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
10aa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10ab0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
10ac0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
10ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10ae0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
10af0 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c  NEVER(p->readOnl
10b00 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
10b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
10b20 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
10b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10b40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
10b50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
10b60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
10b70 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  AINT;.        }e
10b80 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
10b90 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
10ba0 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
10bb0 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
10bc0 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
10bd0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
10be0 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
10bf0 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
10c00 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
10c10 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
10c20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
10c30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
10c40 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
10c50 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
10c60 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
10c70 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
10c80 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
10c90 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
10ca0 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
10cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10cc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
10cd0 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
10ce0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
10cf0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
10d00 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
10d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
10d20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10d30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
10d50 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
10d60 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
10d70 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
10d80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10d90 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
10da0 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  redCons = 0;.   
10db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
10dc0 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
10dd0 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
10de0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
10df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10e00 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
10e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
10e20 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
10e30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10e40 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
10e50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
10e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
10e70 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
10e80 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
10e90 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
10ea0 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
10eb0 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
10ec0 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
10ed0 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
10ee0 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
10ef0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
10f00 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
10f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10f20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
10f30 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
10f40 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
10f50 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10f60 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
10f70 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
10f80 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
10f90 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
10fa0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
10fb0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
10fc0 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
10fd0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
10fe0 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
10ff0 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
11000 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
11010 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
11020 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
11030 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
11040 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
11050 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
11060 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
11070 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
11080 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
11090 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
110a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
110b0 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
110c0 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
110d0 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
110e0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
110f0 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
11100 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
11110 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
11120 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
11130 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
11140 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
11150 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
11160 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
11170 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11180 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
11190 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
111a0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
111b0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
111c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
111d0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
111e0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
111f0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
11200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11210 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
11220 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
11230 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  s(db);.        s
11240 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
11250 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  l(db);.        s
11260 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
11270 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
11280 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
11290 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
112a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
112b0 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
112c0 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
112d0 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
112e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
112f0 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
11300 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
11310 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
11320 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11330 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
11340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11350 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
11360 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
11370 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
11380 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
11390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
113a0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
113b0 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
113c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
113d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
113e0 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
113f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11400 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
11410 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
11420 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  Rollback or comm
11430 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68  it any schema ch
11440 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  anges that occur
11450 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
11460 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
11470 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51   && db->flags&SQ
11480 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
11490 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
114a0 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
114b0 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a  Schema(db, -1);.
114c0 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
114d0 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
114e0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
114f0 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
11500 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
11510 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
11520 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
11530 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
11540 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
11550 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
11560 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
11570 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
11580 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
11590 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
115a0 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20  eVdbeCnt--;.    
115b0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
115c0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72   ){.      db->wr
115d0 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iteVdbeCnt--;.  
115e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
115f0 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
11600 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  t>=db->writeVdbe
11610 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Cnt );.  }.  p->
11620 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
11630 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
11640 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
11650 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
11660 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11670 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
11680 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
11690 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
116a0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
116b0 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
116c0 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
116d0 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
116e0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
116f0 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
11700 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
11710 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
11720 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
11730 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
11740 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
11750 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
11760 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
11770 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
11780 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
11790 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
117a0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
117b0 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e  ->activeVdbeCnt>
117c0 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
117d0 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
117e0 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
117f0 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
11800 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
11810 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
11820 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
11830 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
11840 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
11850 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
11860 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
11870 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
11880 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
11890 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
118a0 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
118b0 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
118c0 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
118d0 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
118e0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
118f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
11900 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
11910 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
11920 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
11930 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
11940 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
11950 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
11960 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
11970 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
11980 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
11990 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
119a0 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
119b0 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
119c0 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
119d0 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
119e0 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
119f0 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
11a00 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
11a10 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
11a20 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
11a30 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
11a40 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
11a50 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
11a60 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
11a70 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
11a80 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
11a90 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
11aa0 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
11ab0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
11ac0 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
11ad0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
11ae0 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
11af0 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
11b00 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
11b10 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
11b20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
11b30 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
11b40 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
11b50 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
11b60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
11b70 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
11b80 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
11b90 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
11ba0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
11bb0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
11bc0 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
11bd0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
11be0 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
11bf0 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
11c00 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
11c10 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
11c20 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
11c30 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
11c40 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
11c50 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
11c60 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11c70 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
11c80 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
11c90 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
11ca0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
11cb0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
11cc0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
11cd0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11ce0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
11cf0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
11d00 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53  ,-1,p->zErrMsg,S
11d10 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54  QLITE_UTF8,SQLIT
11d20 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
11d30 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
11d40 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11d50 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
11d60 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73  = p->rc;.      s
11d70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11d80 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
11d90 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
11da0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
11db0 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
11dc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
11dd0 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
11de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
11df0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
11e00 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
11e10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
11e20 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
11e30 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
11e40 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
11e50 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
11e60 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
11e70 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
11e80 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
11e90 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
11ea0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
11eb0 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
11ec0 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
11ed0 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
11ee0 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
11ef0 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
11f00 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
11f10 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
11f20 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
11f30 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
11f40 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->rc, 0);.    sq
11f50 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
11f60 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
11f70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
11f80 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
11f90 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
11fa0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11fb0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
11fc0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
11fd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
11fe0 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
11ff0 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
12000 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
12010 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
12020 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
12030 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
12040 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
12050 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
12060 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
12070 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
12080 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
12090 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
120a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
120b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
120c0 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
120d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
120e0 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
120f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
12100 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
12110 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
12120 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
12130 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
12140 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12150 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
12160 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
12170 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
12180 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
12190 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
121a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
121b0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
121c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
121d0 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
121e0 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
121f0 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
12200 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
12210 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
12220 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
12230 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
12240 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
12250 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
12260 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
12270 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
12280 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
12290 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
122a0 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
122b0 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
122c0 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
122d0 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
122e0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
122f0 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
12300 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
12310 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
12320 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
12330 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
12340 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
12350 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
12360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12370 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
12380 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
12390 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
123a0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
123b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
123c0 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
123d0 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
123e0 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
123f0 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
12400 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
12410 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12420 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  }../*.** Call th
12430 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
12440 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e   each auxdata en
12450 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63  try in pVdbeFunc
12460 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68   for which.** th
12470 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12480 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63  bit in mask is c
12490 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65  lear.  Auxdata e
124a0 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31  ntries beyond 31
124b0 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64  .** are always d
124c0 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65  estroyed.  To de
124d0 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74  stroy all auxdat
124e0 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20  a entries, call 
124f0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
12500 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f  with mask==0..*/
12510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
12520 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56  eDeleteAuxData(V
12530 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
12540 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  nc, int mask){. 
12550 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
12560 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e  0; i<pVdbeFunc->
12570 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAux; i++){.    
12580 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a  struct AuxData *
12590 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e  pAux = &pVdbeFun
125a0 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20  c->apAux[i];.   
125b0 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28   if( (i>31 || !(
125c0 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c 3c  mask&(((u32)1)<<
125d0 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41  i))) && pAux->pA
125e0 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ux ){.      if( 
125f0 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
12600 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
12610 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
12620 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
12630 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30    pAux->pAux = 0
12640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12650 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
12660 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
12670 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
12680 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
12690 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20  nd argument..** 
126a0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
126b0 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
126c0 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
126d0 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
126e0 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
126f0 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
12700 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
12710 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
12720 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
12730 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12740 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
12750 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
12760 65 6c 65 74 65 4f 62 6a 65 63 74 28 73 71 6c 69  eleteObject(sqli
12770 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
12780 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
12790 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
127a0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
127b0 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d  ( p->db==0 || p-
127c0 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c  >db==db );.  rel
127d0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
127e0 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
127f0 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
12800 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
12810 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
12820 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
12830 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
12840 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
12850 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
12860 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
12870 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
12880 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
12890 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
128a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
128b0 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66  , pSub);.  }.  f
128c0 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b  or(i=p->nzVar-1;
128d0 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69   i>=0; i--) sqli
128e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
128f0 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64  >azVar[i]);.  vd
12900 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
12910 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
12920 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
12930 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  ee(db, p->aLabel
12940 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
12950 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
12960 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
12970 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
12980 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
12990 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
129a0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
129b0 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
129c0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
129d0 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
129e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
129f0 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
12a00 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
12a10 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
12a20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
12a30 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
12a40 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
12a50 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
12a60 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
12a70 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
12a80 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
12a90 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
12aa0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
12ab0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
12ac0 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
12ad0 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
12ae0 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
12af0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
12b00 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
12b10 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12b20 65 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  eObject(db, p);.
12b30 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
12b40 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
12b50 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
12b60 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
12b70 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
12b80 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
12b90 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
12ba0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
12bb0 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
12bc0 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
12bd0 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
12be0 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
12bf0 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
12c00 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
12c10 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
12c20 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
12c30 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
12c40 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
12c50 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
12c60 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
12c70 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
12c80 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
12c90 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
12ca0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
12cb0 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
12cc0 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
12cd0 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
12ce0 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
12cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
12d00 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
12d10 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
12d20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
12d30 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
12d40 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
12d50 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
12d60 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
12d70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12d80 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
12d90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
12da0 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
12db0 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
12dc0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
12dd0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
12de0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
12df0 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
12e00 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
12e10 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
12e20 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
12e30 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
12e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12e50 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
12e60 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
12e70 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
12e80 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
12e90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12ea0 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52  rc;.    p->lastR
12eb0 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f  owid = p->moveto
12ec0 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20  Target;.    if( 
12ed0 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
12ee0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12ef0 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  KPT;.    p->rowi
12f00 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69  dIsValid = 1;.#i
12f10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
12f20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
12f30 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
12f40 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72  dif.    p->defer
12f50 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
12f60 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
12f70 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
12f80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57  .  }else if( ALW
12f90 41 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  AYS(p->pCursor) 
12fa0 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f  ){.    int hasMo
12fb0 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ved;.    int rc 
12fc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
12fd0 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
12fe0 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76  pCursor, &hasMov
12ff0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ed);.    if( rc 
13000 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13010 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b   if( hasMoved ){
13020 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53  .      p->cacheS
13030 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
13040 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75  ALE;.      p->nu
13050 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  llRow = 1;.    }
13060 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
13070 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13080 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13090 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
130a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
130b0 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
130c0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
130d0 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
130e0 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
130f0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
13100 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71  erialPut().** sq
13110 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
13120 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  et().**.** encap
13130 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
13140 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
13150 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
13160 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
13170 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
13180 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
13190 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
131a0 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
131b0 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
131c0 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
131d0 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
131e0 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
131f0 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
13200 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
13210 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
13220 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
13230 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
13240 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
13250 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
13260 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
13270 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
13280 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
13290 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
132a0 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
132b0 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
132c0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
132d0 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
132e0 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
132f0 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
13300 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
13310 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
13320 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
13330 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
13340 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
13350 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a  ob seperately..*
13360 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
13370 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
13380 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
13390 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
133a0 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
133b0 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
133c0 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
133d0 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
133e0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
133f0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
13400 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
13410 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
13440 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
13470 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13480 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
134a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
134b0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
134c0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
134d0 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
134e0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
134f0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
13520 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13530 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
13550 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13560 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13570 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
13580 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
13590 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
135a0 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135c0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
135d0 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
135e0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
135f0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
13600 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
13610 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13630 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
13640 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
13650 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
13660 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
13690 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
136a0 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
136b0 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
136c0 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
136d0 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
136e0 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
136f0 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
13700 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
13710 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
13720 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
13730 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
13740 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
13750 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
13760 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
13770 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
13780 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
13790 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
137a0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
137b0 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
137c0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
137d0 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
137e0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
137f0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
13800 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e  Mem->flags;.  in
13810 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  t n;..  if( flag
13820 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
13830 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
13840 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
13850 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Int ){.    /* Fi
13860 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
13870 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c   to use 1, 2, 4,
13880 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   6 or 8 bytes. *
13890 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
138a0 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30  _6BYTE ((((i64)0
138b0 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d  x00008000)<<32)-
138c0 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70  1).    i64 i = p
138d0 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36  Mem->u.i;.    u6
138e0 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c  4 u;.    if( fil
138f0 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28  e_format>=4 && (
13900 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20  i&1)==i ){.     
13910 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69   return 8+(u32)i
13920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13930 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  i<0 ){.      if(
13940 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20   i<(-MAX_6BYTE) 
13950 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20  ) return 6;.    
13960 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65    /* Previous te
13970 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20  st prevents:  u 
13980 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38  = -(-92233720368
13990 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20  54775808) */.   
139a0 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d     u = -i;.    }
139b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
139c0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
139d0 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e   u<=127 ) return
139e0 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33   1;.    if( u<=3
139f0 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
13a00 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
13a10 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
13a20 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
13a30 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
13a40 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
13a50 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
13a60 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
13a70 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
13a80 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
13a90 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
13aa0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
13ab0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13ac0 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
13ad0 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
13ae0 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20   n = pMem->n;.  
13af0 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
13b00 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
13b10 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
13b20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e    }.  assert( n>
13b30 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
13b40 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
13b50 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
13b60 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
13b70 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
13b80 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
13b90 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
13ba0 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
13bb0 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
13bc0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
13bd0 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
13be0 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
13bf0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
13c00 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
13c10 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
13c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
13c30 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
13c40 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
13c50 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
13c60 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
13c70 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
13c80 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
13c90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  }.}../*.** If we
13ca0 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
13cb0 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
13cc0 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
13cd0 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
13ce0 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
13cf0 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
13d00 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
13d10 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
13d20 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
13d30 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
13d40 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
13d50 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
13d60 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
13d70 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
13d80 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
13d90 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
13da0 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
13db0 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
13dc0 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
13dd0 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
13de0 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
13df0 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
13e00 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
13e10 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
13e20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
13e30 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
13e40 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
13e50 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
13e60 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
13e70 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
13e80 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
13e90 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
13ea0 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
13eb0 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
13ec0 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
13ed0 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
13ee0 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
13ef0 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
13f00 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
13f10 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
13f20 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
13f30 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
13f40 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
13f50 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
13f60 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
13f70 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
13f80 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
13f90 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
13fa0 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
13fb0 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
13fc0 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
13fd0 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
13fe0 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
13ff0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
14000 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
14010 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
14020 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
14030 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
14040 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
14050 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
14060 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
14070 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
14080 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
14090 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
140a0 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
140b0 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
140c0 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
140d0 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
140e0 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
140f0 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
14100 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
14110 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
14120 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
14130 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
14140 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
14150 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
14160 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
14170 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
14180 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
14190 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
141a0 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
141b0 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
141c0 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
141d0 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
141e0 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
141f0 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
14200 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
14210 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
14220 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
14230 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
14240 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
14250 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
14260 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
14270 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
14280 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
14290 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
142a0 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
142b0 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
142c0 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
142d0 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
142e0 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
142f0 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
14300 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
14310 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
14320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
14330 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
14340 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
14350 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
14360 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
14370 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
14380 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
14390 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
143a0 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
143b0 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
143c0 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
143d0 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
143e0 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
143f0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
14400 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
14410 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
14420 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
14430 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
14440 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
14450 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
14460 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
14470 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
14480 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
14490 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
144a0 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
144b0 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
144c0 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
144d0 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
144e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
144f0 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
14500 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
14510 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
14520 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75  t in buf[].  nBu
14530 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  f must always be
14540 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  .** large enough
14550 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
14560 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65  ire field.  Exce
14570 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64  pt, if the field
14580 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69   is.** a blob wi
14590 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  th a zero-filled
145a0 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b   tail, then buf[
145b0 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20  ] might be just 
145c0 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a  the right.** siz
145d0 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74  e to hold everyt
145e0 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20  hing except for 
145f0 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
14600 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a  tail.  If buf[].
14610 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65  ** is only big e
14620 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
14630 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69  e non-zero prefi
14640 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  x, then only wri
14650 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69  te that.** prefi
14660 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42  x into buf[].  B
14670 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c  ut if buf[] is l
14680 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
14690 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20  old both the.** 
146a0 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74  prefix and the t
146b0 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74  ail then write t
146c0 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65  he prefix and se
146d0 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c  t the tail to al
146e0 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a  l.** zeros..**.*
146f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14700 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
14710 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
14720 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
14730 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
14740 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
14750 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
14760 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
14770 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
14780 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
14790 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
147a0 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
147b0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
147c0 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74  Put(u8 *buf, int
147d0 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   nBuf, Mem *pMem
147e0 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
147f0 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c  t){.  u32 serial
14800 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56  _type = sqlite3V
14810 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d  dbeSerialType(pM
14820 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  em, file_format)
14830 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20  ;.  u32 len;..  
14840 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
14850 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
14860 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
14870 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
14880 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75      u64 v;.    u
14890 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  32 i;.    if( se
148a0 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
148b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
148c0 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
148d0 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20  pMem->r) );.    
148e0 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
148f0 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29  em->r, sizeof(v)
14900 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
14910 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
14920 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14930 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
14940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
14950 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
14960 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
14970 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
14980 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75   assert( len<=(u
14990 33 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77  32)nBuf );.    w
149a0 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20  hile( i-- ){.   
149b0 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29     buf[i] = (u8)
149c0 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
149d0 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20  v >>= 8;.    }. 
149e0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
149f0 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
14a00 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
14a10 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
14a20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14a30 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
14a40 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
14a50 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
14a60 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
14a70 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
14a80 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
14a90 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
14aa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14ab0 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a  Mem->n<=nBuf );.
14ac0 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e      len = pMem->
14ad0 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75  n;.    memcpy(bu
14ae0 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
14af0 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  ;.    if( pMem->
14b00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
14b10 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d   ){.      len +=
14b20 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
14b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 42        assert( nB
14b40 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  uf>=0 );.      i
14b50 66 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42  f( len > (u32)nB
14b60 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  uf ){.        le
14b70 6e 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20  n = (u32)nBuf;. 
14b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
14b90 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e  set(&buf[pMem->n
14ba0 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e  ], 0, len-pMem->
14bb0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  n);.    }.    re
14bc0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
14bd0 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
14be0 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
14bf0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
14c00 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
14c10 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
14c20 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
14c30 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
14c40 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
14c50 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
14c60 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
14c70 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14c80 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
14c90 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
14ca0 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
14cb0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14cc0 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
14cd0 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
14ce0 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
14cf0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14d10 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
14d20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
14d30 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d50 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
14d60 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
14d70 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
14d80 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
14d90 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
14da0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
14db0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
14dc0 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
14dd0 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
14de0 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
14df0 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
14e00 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
14e10 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
14e20 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
14e30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
14e40 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
14e50 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
14e60 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
14e70 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  = (signed char)b
14e80 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[0];.      pMe
14e90 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
14ea0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
14eb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
14ec0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
14ed0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
14ee0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
14ef0 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
14f00 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
14f10 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
14f20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14f30 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
14f40 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
14f50 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
14f60 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
14f70 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
14f80 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
14f90 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
14fa0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<16) | (buf[1]<
14fb0 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20  <8) | buf[2];.  
14fc0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14fd0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
14fe0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
14ff0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
15000 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
15010 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
15020 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75   pMem->u.i = (bu
15030 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
15040 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
15050 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
15060 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15070 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15080 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
15090 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
150a0 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
150b0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
150c0 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73      u64 x = (((s
150d0 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
150e0 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
150f0 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28  .      u32 y = (
15100 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[2]<<24) | (b
15110 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[3]<<16) | (bu
15120 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35  f[4]<<8) | buf[5
15130 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
15140 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
15150 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
15160 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65  4*)&x;.      pMe
15170 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
15180 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
15190 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
151a0 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
151b0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
151c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
151d0 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
151e0 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
151f0 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75    u64 x;.      u
15200 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e  32 y;.#if !defin
15210 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
15220 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15230 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
15240 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69  T).      /* Veri
15250 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
15260 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
15270 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
15280 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he same.      **
15290 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
152a0 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
152b0 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
152c0 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
152d0 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
152e0 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
152f0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
15300 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
15310 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  .      ** endian
15320 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15330 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
15340 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
15350 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
15360 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
15370 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
15380 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d  ;.      u64 t2 =
15390 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d   t1;.      swapM
153a0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
153b0 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t2);.      asser
153c0 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
153d0 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
153e0 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
153f0 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
15400 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20  #endif..      x 
15410 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
15420 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
15430 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
15440 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20  f[3];.      y = 
15450 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28  (buf[4]<<24) | (
15460 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[5]<<16) | (b
15470 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[6]<<8) | buf[
15480 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  7];.      x = (x
15490 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
154a0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
154b0 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==6 ){.        p
154c0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
154d0 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
154e0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
154f0 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Int;.      }else
15500 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15510 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
15520 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  & sizeof(pMem->r
15530 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
15540 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
15550 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20  loat(x);.       
15560 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72   memcpy(&pMem->r
15570 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
15580 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
15590 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
155a0 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20  sNaN(pMem->r) ? 
155b0 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
155c0 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eal;.      }.   
155d0 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20     return 8;.   
155e0 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
155f0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
15600 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
15610 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
15620 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
15630 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
15640 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
15650 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15660 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
15670 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
15680 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65  : {.      u32 le
15690 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
156a0 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
156b0 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
156c0 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
156d0 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  >n = len;.      
156e0 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pMem->xDel = 0;.
156f0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
15700 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20  _type&0x01 ){.  
15710 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15720 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45  s = MEM_Str | ME
15730 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
15740 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
15750 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15760 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  Blob | MEM_Ephem
15770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15780 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20  return len;.    
15790 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
157a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
157b0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
157c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
157d0 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
157e0 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
157f0 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
15800 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
15810 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
15820 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
15830 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
15840 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
15850 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
15860 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
15870 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
15880 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
15890 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
158a0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
158b0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
158c0 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
158d0 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
158e0 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
158f0 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
15900 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
15910 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
15920 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
15930 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
15940 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
15950 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
15960 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
15970 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
15980 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
15990 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
159a0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
159b0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
159c0 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
159d0 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
159e0 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
159f0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
15a00 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
15a10 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
15a20 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
15a30 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
15a40 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
15a50 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
15a60 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
15a70 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
15a80 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
15a90 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
15aa0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
15ab0 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
15ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15ad0 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64      /* Unaligned
15ae0 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
15af0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
15b00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15b10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
15b20 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
15b30 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
15b40 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  pFree           
15b50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
15b60 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72  Caller should fr
15b70 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  ee this pointer 
15b80 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
15b90 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
15ba0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
15bb0 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
15bc0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  turn */.  int nO
15bd0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
15be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
15bf0 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79  rement pSpace by
15c00 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69   nOff to align i
15c10 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
15c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15c30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15c40 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
15c50 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20  ed for *p */..  
15c60 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  /* We want to sh
15c70 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
15c80 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
15c90 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
15ca0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
15cb0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
15cc0 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
15cd0 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
15ce0 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
15cf0 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
15d00 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
15d10 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
15d20 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
15d30 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
15d40 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
15d50 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
15d60 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
15d70 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   7;.  nByte = RO
15d80 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
15d90 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
15da0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
15db0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
15dc0 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
15dd0 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20  pace+nOff ){.   
15de0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
15df0 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
15e00 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
15e10 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
15e20 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63      *ppFree = (c
15e30 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28  har *)p;.    if(
15e40 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
15e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
15e60 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
15e70 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b  *)&pSpace[nOff];
15e80 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30  .    *ppFree = 0
15e90 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d  ;.  }..  p->aMem
15ea0 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
15eb0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
15ec0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
15ed0 64 29 29 5d 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  d))];.  p->pKeyI
15ee0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
15ef0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
15f00 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
15f10 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
15f20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
15f30 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
15f40 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
15f50 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
15f60 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
15f70 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
15f80 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
15f90 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
15fa0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
15fb0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
15fc0 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
15fd0 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
15fe0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
15ff0 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
16000 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
16010 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
16020 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
16030 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
16040 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
16050 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
16060 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
16070 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
16080 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
16090 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
160a0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
160b0 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
160c0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
160d0 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
160e0 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
160f0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
16100 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
16110 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
16120 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
16130 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
16160 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
16170 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
16180 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
16190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
161a0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
161b0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
161c0 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
161d0 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
161e0 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61  ->flags = 0;.  a
161f0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
16200 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
16210 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
16220 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
16230 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
16240 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
16250 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
16260 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26  && u<p->nField &
16270 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
16280 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
16290 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
162a0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
162b0 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
162c0 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
162d0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
162e0 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
162f0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
16300 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
16310 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
16320 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16330 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
16340 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
16350 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  em->zMalloc = 0;
16360 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30  .    pMem->z = 0
16370 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
16380 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16390 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
163a0 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
163b0 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
163c0 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
163d0 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
163e0 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
163f0 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
16400 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16410 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
16420 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
16430 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
16440 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
16450 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
16460 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
16470 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
16480 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
16490 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
164a0 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
164b0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
164c0 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
164d0 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
164e0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
164f0 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
16500 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
16510 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
16520 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
16530 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
16540 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
16550 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
16560 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
16570 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
16580 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
16590 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
165a0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
165b0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
165c0 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
165d0 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74  ..** The key wit
165e0 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69  h fewer fields i
165f0 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72  s usually compar
16600 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
16610 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e   .** longer key.
16620 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65    However if the
16630 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
16640 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79  Y flags in pPKey
16650 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20  2 is set.** and 
16660 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
16670 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  xes are equal, t
16680 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73  hen key1 is less
16690 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f   than key2..** O
166a0 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
166b0 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66  D_MATCH_PREFIX f
166c0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
166d0 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a  he prefixes are.
166e0 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  ** equal, then t
166f0 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73  he keys are cons
16700 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
16710 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61  al and.** the pa
16720 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63  rts beyond the c
16730 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65  ommon prefix are
16740 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
16750 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
16760 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61  IGNORE_ROWID fla
16770 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
16780 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
16790 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
167a0 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65   pKey1 is ignore
167b0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
167c0 64 20 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a  d that pKey1 is.
167d0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c  ** an index key,
167e0 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77   and thus ends w
167f0 69 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75  ith a rowid valu
16800 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79 74  e.  The last byt
16810 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64  e.** of the head
16820 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  er will therefor
16830 65 20 62 65 20 74 68 65 20 73 65 72 69 61 6c 20  e be the serial 
16840 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
16850 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20  d:.** one of 1, 
16860 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38  2, 3, 4, 5, 6, 8
16870 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74  , or 9 - the int
16880 65 67 65 72 20 73 65 72 69 61 6c 20 74 79 70 65  eger serial type
16890 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c  s..** The serial
168a0 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e   type of the fin
168b0 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c  al rowid will al
168c0 77 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65  ways be a single
168d0 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e   byte..** By ign
168e0 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20  oring this last 
168f0 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
16900 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65  er, we force the
16910 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74   comparison.** t
16920 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77  o ignore the row
16930 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
16940 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71   key1..*/.int sq
16950 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
16960 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
16970 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
16980 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
16990 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
169a0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
169b0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
169c0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  key */.){.  int 
169d0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
169e0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
169f0 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
16a00 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
16a10 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
16a20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
16a30 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
16a40 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
16a50 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
16a60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16a70 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
16a80 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
16a90 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
16aa0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
16ab0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
16ac0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
16ad0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16ae0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
16af0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16b00 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
16b10 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
16b20 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
16b30 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
16b40 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
16b50 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
16b60 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
16b70 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
16b80 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
16b90 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
16ba0 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
16bb0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a  VVA_ONLY( mem1.z
16bc0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
16bd0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
16be0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
16bf0 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
16c00 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
16c10 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
16c20 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
16c30 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16c40 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
16c50 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
16c60 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
16c70 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
16c80 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
16c90 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
16ca0 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
16cb0 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
16cc0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
16cd0 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
16ce0 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
16cf0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
16d00 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
16d10 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
16d20 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
16d30 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
16d40 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
16d50 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
16d60 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
16d70 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
16d80 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
16d90 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
16da0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
16db0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
16dc0 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
16dd0 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
16de0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
16df0 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
16e00 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
16e10 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
16e20 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
16e30 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
16e40 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
16e50 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
16e60 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  ORE_ROWID ){.   
16e70 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20   szHdr1--;.  }. 
16e80 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
16e90 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
16ea0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
16eb0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
16ec0 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
16ed0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
16ee0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
16ef0 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
16f00 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
16f10 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
16f20 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
16f30 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
16f40 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
16f50 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
16f60 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
16f70 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
16f80 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
16f90 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
16fa0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
16fb0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
16fc0 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
16fd0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
16fe0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
16ff0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
17000 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
17010 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
17020 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
17030 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17040 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
17050 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
17060 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
17090 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
170a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
170b0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
170c0 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
170d0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
170e0 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a  mment below */..
170f0 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20        /* Invert 
17100 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65  the result if we
17110 20 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20   are using DESC 
17120 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
17130 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
17140 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
17150 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65   i<nField && pKe
17160 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
17170 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
17180 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
17190 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }.    .      /* 
171a0 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  If the PREFIX_SE
171b0 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ARCH flag is set
171c0 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20   and all fields 
171d0 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c  except the final
171e0 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  .      ** rowid 
171f0 66 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c  field were equal
17200 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
17210 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
17220 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20  lag and set .   
17230 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f     ** pPKey2->ro
17240 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  wid to the value
17250 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
17260 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e  eld in (pKey1, n
17270 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20  Key1)..      ** 
17280 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
17290 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
172a0 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  opcode..      */
172b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65  .      if( (pPKe
172c0 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
172d0 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52  CKED_PREFIX_SEAR
172e0 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79  CH) && i==(pPKey
172f0 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a  2->nField-1) ){.
17300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17310 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20  idx1==szHdr1 && 
17320 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rc );.        as
17330 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73  sert( mem1.flags
17340 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
17350 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c        pPKey2->fl
17360 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44  ags &= ~UNPACKED
17370 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a  _PREFIX_SEARCH;.
17380 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
17390 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69  rowid = mem1.u.i
173a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
173b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
173c0 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
173d0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f   }..  /* No memo
173e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
173f0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
17400 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
17410 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
17420 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
17430 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
17440 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
17450 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
17460 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
17470 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
17480 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
17490 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
174a0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
174b0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
174c0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
174d0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
174e0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
174f0 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
17500 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
17510 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
17520 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
17530 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
17540 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c  _INCRKEY.  ** fl
17550 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
17560 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
17570 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
17580 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49  s larger..  ** I
17590 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52  f the UPACKED_PR
175a0 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20  EFIX_MATCH flag 
175b0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79  is set, then key
175c0 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72  s with common pr
175d0 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20  efixes.  ** are 
175e0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
175f0 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69   equal.  Otherwi
17600 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b  se, the longer k
17610 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20  ey is the .  ** 
17620 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68  larger.  As it h
17630 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65  appens, the pPKe
17640 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  y2 will always b
17650 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a  e the longer.  *
17660 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
17670 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
17680 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
17690 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32   );.  if( pPKey2
176a0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
176b0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
176c0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c    rc = -1;.  }el
176d0 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  se if( pPKey2->f
176e0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
176f0 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a  PREFIX_MATCH ){.
17700 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
17710 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  =0 */.  }else if
17720 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b  ( idx1<szHdr1 ){
17730 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
17740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17750 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
17760 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
17770 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
17780 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
17790 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
177a0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
177b0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
177c0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
177d0 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
177e0 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
177f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
17800 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
17810 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
17820 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
17830 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
17840 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
17850 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
17860 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
17870 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
17880 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
17890 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
178a0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
178b0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
178c0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
178d0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
178e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
178f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
17900 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
17910 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
17920 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
17930 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
17940 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
17950 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
17960 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
17970 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
17980 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
17990 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
179a0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
179b0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
179c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
179d0 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  TER(db);..  /* G
179e0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
179f0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
17a00 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
17a10 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
17a20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
17a30 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
17a40 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
17a50 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
17a60 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
17a70 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
17a80 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
17a90 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
17aa0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
17ab0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
17ac0 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
17ad0 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
17ae0 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
17af0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
17b00 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
17b10 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
17b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17b30 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
17b40 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
17b50 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
17b60 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
17b70 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
17b80 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
17b90 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
17ba0 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
17bb0 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
17bc0 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
17bd0 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
17be0 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
17bf0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
17c00 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
17c10 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
17c20 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
17c30 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
17c40 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
17c50 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
17c60 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
17c70 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
17c80 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
17c90 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
17ca0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
17cb0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
17cc0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
17cd0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
17ce0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
17cf0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
17d00 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
17d10 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
17d20 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
17d30 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
17d40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17d50 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17d60 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
17d70 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
17d80 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
17d90 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
17da0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
17db0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
17dc0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
17dd0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
17de0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
17df0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
17e00 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
17e10 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
17e20 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
17e30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17e40 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
17e50 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17e60 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
17e70 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17e80 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
17e90 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
17ea0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17eb0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
17ec0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17ed0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
17ee0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17ef0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
17f00 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
17f10 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
17f20 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
17f30 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
17f40 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17f50 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
17f60 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
17f70 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
17f80 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
17f90 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
17fa0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
17fb0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17fc0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
17fd0 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
17fe0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
17ff0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
18000 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
18010 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
18020 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
18030 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
18040 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
18050 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
18060 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
18070 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
18080 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
18090 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
180a0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
180b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
180c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
180d0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
180e0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
180f0 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
18100 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
18110 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
18120 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
18130 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
18140 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
18150 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
18160 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21  case( m.zMalloc!
18170 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
18180 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
18190 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
181a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
181b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
181c0 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
181d0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
181e0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
181f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
18200 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
18210 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
18220 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
18230 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
18240 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
18250 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
18260 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
18270 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
18280 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
18290 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
182a0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
182b0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
182c0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
182d0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
182e0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
182f0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
18300 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
18310 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
18320 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
18330 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
18340 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
18350 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
18360 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
18370 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
18380 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
18390 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
183a0 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
183b0 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
183c0 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
183d0 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
183e0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
183f0 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65  yCompare(.  Vdbe
18400 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
18410 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
18420 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
18430 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
18440 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
18450 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70  npacked,  /* Unp
18460 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
18470 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
18480 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
18490 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
184a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
184b0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
184c0 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
184d0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
184e0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
184f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
18500 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
18510 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
18520 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
18530 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
18540 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  Cur) );.  rc = s
18550 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
18560 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
18570 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
18580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
18590 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
185a0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
185b0 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
185c0 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
185d0 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
185e0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
185f0 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
18600 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20  se of the say.  
18610 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
18620 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
18630 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
18640 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
18650 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
18660 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
18670 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
18680 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
18690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
186a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
186b0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
186c0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
186d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
186e0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
186f0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
18700 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
18710 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
18720 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
18730 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
18740 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67   pUnpacked->flag
18750 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
18760 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a  ORE_ROWID );.  *
18770 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
18780 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
18790 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
187a0 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
187b0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
187c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
187d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
187e0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
187f0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
18800 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
18810 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
18820 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
18830 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
18840 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
18850 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
18860 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
18870 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
18880 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
18890 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
188a0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
188b0 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
188c0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
188d0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
188e0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
188f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
18900 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
18910 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
18920 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
18930 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
18940 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
18950 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
18960 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
18970 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
18980 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
18990 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
189a0 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
189b0 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
189c0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
189d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
189e0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
189f0 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
18a00 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
18a10 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
18a20 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
18a30 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
18a40 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
18a50 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
18a60 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
18a70 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
18a80 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
18a90 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
18aa0 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
18ab0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
18ac0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
18ad0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
18ae0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
18af0 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
18b00 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
18b10 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
18b20 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
18b30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18b40 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
18b50 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
18b60 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
18b70 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
18b80 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
18b90 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
18ba0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
18bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
18bd0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
18be0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
18bf0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
18c00 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
18c10 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
18c20 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
18c30 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
18c40 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
18c50 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
18c60 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
18c70 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
18c80 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
18c90 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
18ca0 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
18cb0 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
18cc0 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
18cd0 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
18ce0 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
18cf0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
18d00 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
18d10 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
18d20 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
18d30 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
18d40 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
18d50 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
18d60 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
18d70 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
18d80 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
18d90 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
18da0 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  etValue(Vdbe *v,
18db0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
18dc0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
18dd0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
18de0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
18df0 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
18e00 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
18e10 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
18e20 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
18e30 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
18e40 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
18e50 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
18e60 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
18e70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18e80 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
18e90 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
18ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18eb0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
18ec0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
18ed0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
18ee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
18ef0 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d  emStoreType((Mem
18f00 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20   *)pRet);.      
18f10 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
18f20 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
18f30 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18f40 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
18f50 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
18f60 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
18f70 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
18f80 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
18f90 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
18fa0 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
18fb0 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
18fc0 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
18fd0 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
18fe0 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
18ff0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
19000 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
19010 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
19020 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
19030 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
19040 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
19050 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
19060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
19070 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
19080 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
19090 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
190a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
190b0 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
190c0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
190d0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
190e0 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
190f0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
19100 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
19110 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
19120 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
19130 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
19140 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
19150 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
19160 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
19170 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
19180 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
19190 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
191a0 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
191b0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
191c0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
191d0 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
191e0 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
191f0 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
19200 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
19210 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
19220 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
19230 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  b, UnpackedRecor
19240 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  d *p){.  if( p )
19250 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
19260 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
19270 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
19280 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
19290 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20  p->aMem[i];.    
192a0 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c    if( pMem->zMal
192b0 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62  loc ) sqlite3Vdb
192c0 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
192d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
192e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
192f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
19300 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
19310 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74  pdate hook. If t
19320 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
19330 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75   or DELETE pre-u
19340 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74  pdate call,.** t
19350 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65  hen cursor passe
19360 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
19370 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
19380 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77  point to the row
19390 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20   about.** to be 
193a0 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  update or delete
193b0 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  d. If the applic
193c0 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ation calls sqli
193d0 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
193e0 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75  d(),.** the requ
193f0 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ired value will 
19400 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
19410 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20   row the cursor 
19420 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f  points to..*/.vo
19430 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
19440 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56  eUpdateHook(.  V
19450 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
19460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19470 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74  * Vdbe pre-updat
19480 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65  e hook is invoke
19490 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75  d by */.  VdbeCu
194a0 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
194b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
194c0 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e  sor to grab old.
194d0 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f  * values from */
194e0 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53     /* SQLITE_INS
19510 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
19520 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  ELETE */.  const
19530 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
19540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
19550 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
19560 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62   /* Modified tab
19590 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  le */.  i64 iKey
195a0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
195b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
195c0 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  al key value */.
195d0 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
19600 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a  r new.* record *
19610 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
19620 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36  db = v->db;.  i6
19630 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70  4 iKey2;.  PreUp
19640 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a  date preupdate;.
19650 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
19660 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl = pTab->zName
19670 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  ;..  assert( db-
19680 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29  >pPreUpdate==0 )
19690 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75  ;.  memset(&preu
196a0 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pdate, 0, sizeof
196b0 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20  (PreUpdate));.  
196c0 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  if( op==SQLITE_U
196d0 50 44 41 54 45 20 29 7b 0a 20 20 20 20 69 4b 65  PDATE ){.    iKe
196e0 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65  y2 = v->aMem[iRe
196f0 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b  g].u.i;.  }else{
19700 0a 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65  .    iKey2 = iKe
19710 79 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  y1;.  }..  asser
19720 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  t( pCsr->nField=
19730 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20  =pTab->nCol .   
19740 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46      || (pCsr->nF
19750 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
19760 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  +1 && op==SQLITE
19770 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d  _DELETE && iReg=
19780 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65  =-1).  );..  pre
19790 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20  update.v = v;.  
197a0 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d  preupdate.pCsr =
197b0 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61   pCsr;.  preupda
197c0 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72  te.op = op;.  pr
197d0 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20  eupdate.iNewReg 
197e0 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64  = iReg;.  preupd
197f0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d  ate.keyinfo.db =
19800 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65   db;.  preupdate
19810 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45  .keyinfo.enc = E
19820 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64  NC(db);.  preupd
19830 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65  ate.keyinfo.nFie
19840 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ld = pTab->nCol;
19850 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
19860 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72  y1 = iKey1;.  pr
19870 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20  eupdate.iKey2 = 
19880 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61  iKey2;.  preupda
19890 74 65 2e 69 50 4b 65 79 20 3d 20 70 54 61 62 2d  te.iPKey = pTab-
198a0 3e 69 50 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70  >iPKey;..  db->p
198b0 50 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65  PreUpdate = &pre
198c0 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50  update;.  db->xP
198d0 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  reUpdateCallback
198e0 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41  (db->pPreUpdateA
198f0 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c  rg, db, op, zDb,
19900 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b   zTbl, iKey1, iK
19910 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65  ey2);.  db->pPre
19920 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71  Update = 0;.  sq
19930 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19940 70 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72  preupdate.aRecor
19950 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
19960 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
19970 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b  date.pUnpacked);
19980 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
19990 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
199a0 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b  e.pNewUnpacked);
199b0 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65  .  if( preupdate
199c0 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  .aNew ){.    int
199d0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
199e0 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b   i<pCsr->nField;
199f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
19a00 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
19a10 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e  se(&preupdate.aN
19a20 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
19a30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19a40 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e  db, preupdate.aN
19a50 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ew);.  }.}.#endi
19a60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
19a70 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
19a80 4b 20 2a 2f 0a                                   K */.